Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 未绑定LocalError的本地和全局引用_Python_Function_Global_Local - Fatal编程技术网

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期待着在范围内恢复声明的变量以掩盖全局变量”