神秘的 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
,因此会引发错误。
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
,因此会引发错误。