神秘的 Python 全局 vs 函数作用域问题

Mysterious Python global vs function scope issue

def take_damage():
  health -= 20  # UNDERSTANDABLE ERROR

def check_health():
  if (health <= 0):   # WHY NO ERROR HERE, TOO?
    print("You have died!")
    quit()
  else:
    print("Your health is "+ str(health)) # HOW DOES IT WORK HERE?
     
  
health = 100
take_damage()
check_health()

现在,如果我想使用这段代码,我会以 global health 开始每个方法,以超出函数的局部范围。但是,我无法解释为什么 check_health 不会像 take_damage 那样抛出错误。请问谁能解释一下?

take_damage中,赋值health定义为局部变量。

check_health 中,缺少赋值使得 health 成为一个 自由 变量。自由变量的值取自最近的定义变量的封闭范围。因为 health 是在调用 check_health 之前在全局范围内定义的,所以没有 NameError 结果。

顺便说一句,函数内部 global health 的目的是将 health 从自由变量更改为全局变量,以便赋值和查找都将发生在全局范围内.

当您在函数内部调用 health -= 20 时,python 在函数内部搜索 health 变量。 你所做的就像做的那样

health = health - 20

但由于之前未在该命名空间中定义 health,因此会引发错误。