Ответ от @roganjosh правильный, но я хотел добавить еще одну заметку, потому что я думаю, что это действительно важный момент о том, как работает Python. Это то, что люди, пришедшие из C / C ++ / Java (то есть почти все мы), должны не учиться при использовании Python.
Как я уже говорил в комментариях выше, в исходном коде от Марии Лауры, похоже, что вызов hit_stand
предназначен для использования некоторых переменных (таких как stand
) в качестве выходных переменных, а в Python мы не можем иметь «выходные переменные» в вызове функции. Но Мария Лаура упомянула, что «удар работает хорошо», что означает, что параметр player
изменялся. Итак, , если мы не можем иметь «выходные переменные», то почему значение player
модифицируется функцией hit_stand
?
Когда код вызывает hit_stand
, пять объекты передаются в функцию:
deck
, player
, [ 1132] 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
, которые будут видны во внешней области, не может быть такой вещи, как «передача по ссылке» или «выходной параметр», как у нас в других языках. [1140 ]
Эта концепция поначалу может показаться очень чуждой, пока мы не изучим то, что узнали в нашем обучении C / C ++ / Java.
Если Вы не хотите должными быть волноваться о проблемах Нулевого значения как проверка пустой указатель каждый раз, когда Вы используете его или оборачивание его в некоторой логике, и Вы также не хотите должными быть волноваться о проблемах времени смещения, то это - то, как я решил проблему:
startDate = startDate < DateTime.MinValue.AddDays(1) ? keepIt : resetIt
я просто проверяю, что принявшее значение по умолчанию значение спустя меньше чем день после начала времени. Работы как очарование.