Хелпикс

Главная

Контакты

Случайная статья





Мутабельные объекты как значения по умолчанию



Мутабельные объекты как значения по умолчанию

Когда речь идет о мутабельных объектах, все становится немого сложнее. Давайте установим список как значение по умолчанию и посмотрим, как все будет работать:

def add_player(player, team=[]):
...
team.append(player)
return team

Как видно, функция просто добавляет нового игрока в команду. Для начала мы зададим оба аргумента:

ice_hockey_team = add_player("Chris", ["Robert", "Alice"])
print(ice_hockey_team) # ['Robert', 'Alice', 'Chris']

Все выглядит номарльно. Однко, когда мы вызовен функцию, описаясь на значение по умолчанию, помедение функции будет отличаться от того, что мы ожидаем.

rugby_team = add_player("Robin")
print(rugby_team) # ['Robin']

football_team = add_player("Andrew")
print(football_team) # ['Robin', 'Andrew']
print(rugby_team) # ['Robin', 'Andrew']

Вместо двух отдельных списков команд, на удивление, мы получили всего один. С каждым новым вызовом, функция будет добавлять новый элемент в этот список. Почему так? Оказывается, значения по умолчанию вычисляются всего один раз.

После того, как вы определили функцию, создается новый объект для значения по умолчанию. С этого момента времени он будет использоваться. Это означает, что если функция каким-то образом изменяет этот объект, значение по умолчанию мутабельного объекта тоже изменяется. По этой причине использовать мутабельные объекты как значения по умолчанию нужно очень осторожно.

Здесь представлено распространенный способ исправить проблему мутабельных объектов, которую мы рассмотрели ранее.

def add_player(player, team=None):
if team is None:
team = []
team.append(player)
return team

 Установка значения по умолчанию значением None и явное присвоение параметру team значения пустого списка позволяет создавать новый список каждый раз, когда функция вызывается.



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.