Проблема в объеме. enemy_score
в вашей функции kill()
- это не то же самое enemy_score
, которое существует вне функции. Скажем, у вас есть эта договоренность:
enemy_score = 50
...
def kill(enemy_score):
enemy_score -= 10
print(enemy_score)
print(enemy_score)
kill(enemy_score)
print(enemy_score)
Вы увидите, что вывод этого фрагмента
50
40
50
Другими словами, enemy_score
из внешней области видимости явно не меняется, тогда как enemy_score
внутри функции явно делает .
Дело в том, что когда вы определяете kill(enemy_score=...)
, вы делаете следующее: «Я хочу, чтобы функция называлась kill
, и я хочу, чтобы она вызывалась с одним аргументом, который назначен переменной с именем enemy_score
«. Python знает, что у вас уже есть переменная enemy_score
, но вы объявили, что вне этой функции, и ясно, что если вы определяете ее по-разному внутри функции, то , пока вы находитесь внутри функции, python будет использовать версия изнутри функции . Внешние enemy_score
и внутренние enemy_score
являются различными переменными , и в результате изменение внутреннего enemy_score
не изменяет внешнее enemy_score
.
Когда python вызывает функцию с переменной (например, kill(enemy_score)
), он не передает саму переменную (называемую передачей по ссылке - некоторые другие языки программирования делают это, и если в этом случае изменение внутреннего enemy_score
изменило бы внешнее enemy_score
). Скорее, он передает значение - он копирует значение enemy_score
и отправляет его функции.
Теперь есть два способа решения этой проблемы. Во-первых, вместо передачи enemy_score
в качестве переменной, наследовать ее из глобальной области видимости:
enemy_score = 50
...
def kill():
global enemy_score # <----
enemy_score -= 10
print(enemy_score)
print(enemy_score)
kill()
print(enemy_score)
Это печатает 50 40 40
.
Тот факт, что вы должны сказать global enemy_score
, - это странная причуда python, но вы должны сделать это, если хотите вывести переменную из глобального пространства имен внутри функции.
Вторым решением будет kill()
вернуть значение внутреннего enemy_score
после его изменения, а затем присвоить его внешнему enemy_score
:
enemy_score = 50
...
def kill(enemy_score):
enemy_score -= 10
print(enemy_score)
return enemy_score # <----
print(enemy_score)
enemy_score = kill(enemy_score)
print(enemy_score)
Также печатается 50 40 40
, как и ожидалось.
Оба эти решения довольно распространены, хотя то, что лучше использовать, зависит от ситуации. В этом случае я бы рекомендовал использовать вторую версию.