Python 未绑定LocalError的本地和全局引用
我不太明白为什么要写代码Python 未绑定LocalError的本地和全局引用,python,function,global,local,Python,Function,Global,Local,我不太明白为什么要写代码 def f(): print(s) s = "foo" f() 运行非常好,但是 def f(): print(s) s = "bar" s = "foo" f() 给我一个UnboundLocalError。我知道我可以通过将s声明为函数内的全局变量,或者简单地将s作为一个参数传递给函数来解决这个问题 我仍然不明白python是如何在执行该行之前知道函数中是否引用了s的?当函数被读入全局框架时,python是否会列出所有局部变量引用的某
def f():
print(s)
s = "foo"
f()
运行非常好,但是
def f():
print(s)
s = "bar"
s = "foo"
f()
给我一个UnboundLocalError。我知道我可以通过将s声明为函数内的全局变量,或者简单地将s作为一个参数传递给函数来解决这个问题
我仍然不明白python是如何在执行该行之前知道函数中是否引用了s的?当函数被读入全局框架时,python是否会列出所有局部变量引用的某种列表?是的,python会提前恢复在局部范围内声明的所有变量。这些将掩盖全局变量 因此,在您的代码中:
def f():
print(s)
s = "foo"
f()
Python没有在本地范围中找到s
,因此它尝试从全局范围中恢复它,并找到“foo”
在另一种情况下,会发生以下情况:
def f():
print(s)
s = "bar
s = "foo"
f()
Python知道s
是一个局部变量,因为它在运行前做了一个前瞻,但在运行时它还没有被赋值,所以它引发了异常
请注意,Python甚至允许您引用未在任何地方声明的变量。如果您这样做:
def foo():
return x
f()
您将得到一个namererror
,因为Python在没有找到作为局部变量的x
时只会记住,在运行时它应该查找名为x
的全局变量,如果它不存在,则会失败
因此
UnboundLocalError
意味着变量最终可能会在作用域中声明,但尚未声明。另一方面,namererror
意味着变量永远不会在局部范围内声明,因此Python试图在全局范围内找到它,但它并不存在。其他答案侧重于这方面的实际问题,但实际上并没有回答您提出的问题
是的,Python编译器会跟踪编译代码块时分配的变量(例如在def
中)。如果在块中指定了名称,编译器会将其标记为本地。请查看函数。\uuuuu code\uuuu.co\u varnames
,查看编译器已识别哪些变量
非局部
和全局
语句可以覆盖这一点。函数对象似乎知道所有这些内容。您可以使用f.\uuuuu code\uuuu
进行检查。具有诸如co\u nlocals
、co\u varnames
等属性的。在声明之前,您并没有引用该条。你只是在定义一个函数<代码>条形图将在运行时被引用,并且在本地功能范围foo之前,它将是一个全局的!是的,您正在引用全局名称栏。由于Python使用哈希表来恢复其变量,它只记得在运行时它应该使用哈希栏,并从全局范围恢复相应的值。@ElisByberi我明白你的意思,我想,我会澄清Python实际上并没有声明变量。你有点偏离主题了。再次看问题。是的,你是对的。。。答案应该是“是的,Python期待着在范围内恢复声明的变量以掩盖全局变量”