Ответ @roganjosh правильный, но я хотел добавить еще одну заметку, потому что я думаю, что это действительно важный момент о том, как работает Python.Это то, что люди, пришедшие из C / C ++ / Java (то есть почти все мы), должны не учиться при использовании Python.
Как я уже говорил в комментариях выше, в исходном кодеот Марии Лауры, похоже, что вызов hit_stand
предназначен для использования некоторых переменных (например, stand
) в качестве выходных переменных, а в Python у нас не может быть "выходных переменных" в вызове функции.Но Мария Лаура упомянула, что «удар работает хорошо», что означает, что параметр player
изменялся.Итак, если у нас не может быть «выходных переменных», то почему значение player
модифицируется функцией hit_stand
?
Когда код вызывает hit_stand
, пятьобъекты передаются в функцию:
- Объект списка, которому присваивается имя
deck
, - Объект списка, которому присваивается имя
player
, - Объект списка, которому присваивается имя
dealer
, - Логический объект, которому присваивается имя
hand
, - Логический объект, которому присваиваетсяимя
stand
Код за пределами этой функции также имеет имена (deck, player, dealer, first_hand, standing)
, указывающие на эти же пять объектов.В коде hit_stand
метод .append()
вызывается для объектов списка player
и dealer
, а метод .pop()
вызывается для объекта deck
, поэтому все эти объекты мутируют.Имена из вызывающей области по-прежнему указывают на те же объекты, поэтому эти имена теперь будут видеть эти изменения.
История для hand
и stand
отличается.Внутри функции hit_stand
hand
и stand
назначаются новые значения с помощью оператора =
.Как отмечалось в этой превосходной статье Фредрика Лунда , оператор =
в Python не «изменяет» переменную, он просто берет объект и связывает его с именем. Сами объекты не изменились, вместо этого они были заменены новыми логическими объектами. Таким образом, переменная standing
во внешней области все еще указывает на свой исходный логический объект, а переменная stand
внутри функцииуказывает на совершенно новый логический объект, отличный от внешнего объекта.Мы ничего не можем сделать с переменными hand
и stand
, которые будут видны во внешней области, не может быть такой вещи, как «передача по ссылке» или «выходной параметр», как у нас в других языках.
Поначалу эта концепция может показаться очень чуждой, пока мы не изучим то, что узнали в нашем обучении C / C ++ / Java.