我正在使用Python 3.7.0,并且正在做一些实验,以了解可变范围的细微差别,但我仍然不了解这种行为。
当我执行此代码时:
def f():
x=0
def g():y=x+1;x=y
return g
f()()
我得到UnboundLocalError:分配前引用了局部变量'x'
但是,当我执行此命令时:
def f():
x=0
def g():y=x+1
return g
f()()
效果很好。甚至这个:
def f():
x=0
def g():x=1
return g
f()()
也可以。所以我很困惑。在我看来,如果在1
函数中将值x
分配给非局部变量g
,则单独工作正常,另一方面,如果在表达式中将包含x
的表达式分配给局部变量y
功能g
也可以正常工作,然后指令y=x+1
和x=y
都应起作用。我不明白是什么导致了错误。我觉得我对Python行为的了解缺少一些基本知识。
我会对此建议不明智。在以下代码中:
def f():
x = 0 # assignment makes this x local to f()
def g():
y = x + 1
x = y # assignment makes this x local to g()
return g
f()()
x
中g()
的赋值强制其成为g()
局部变量。因此,当您访问未分配的本地值时,第一行会导致错误。我相信这种“赋值使其局部化”的逻辑不会遵循程序的流程-将函数视为整体来确定,然后逐行查看代码。
您可以从函数访问作用域中的任何变量,但只能设置本地变量。除非您已声明变量,否则将其分配为global
或nonlocal
:
def f():
x = 0 # assignment makes this x local to f()
def g():
nonlocal x
y = x + 1
x = y # x is declared to come from a nonlocal scope
return g
f()()
在第二个示例中,这不是问题,因为您仅查看x
的值,而不进行设置,因此它可以来自任何适当的范围:
def f():
x = 0 # assignment makes this x local to f()
def g():
y = x + 1 # x comes from an outer scope
return g
f()()
最后,您的第三个示例与第一个示例相同,没有未分配的局部变量使用错误:
def f():
x = 0 # assignment makes this x local to f()
def g():
x = 1 # assignment makes this x local to g()
return g
f()()
在我看来,如果将值1分配给非局部变量g函数中的x单独可以正常工作
您如何确定x
中f()
的重新分配工作正常?