我正在学习Python。一本关于Python 3的书说下面的代码应该可以正常工作:
def funky():
print(myvar)
myvar = 20
print(myvar)
myvar = 10
funky()
但是当我在Python 3.3中运行它时,我得到了
UnboundLocalError: local variable 'myvar' referenced before assignment
错误。我的理解是,funky
中的第一个print(myvar)
应该是10,因为它是一个全局变量。第二个print(myvar)
应该是20,因为本地myvar
被定义为20。这是怎么回事?
在赋值之前,需要在函数中调用global
。
def funky():
global myvar
print(myvar)
myvar = 20
print(myvar)
myvar = 10
funky()
请注意,您可以在不调用global的情况下打印值,因为您可以在不使用global
的情况下访问全局变量,但是尝试赋值将需要它。
From the docs:
程序文本中出现的每一个名称都指向的绑定的最内层函数块中建立的名称使用。
这意味着除非你声明global
或nonlocal
(嵌套函数),否则myvar
是一个局部变量或自由变量(如果myvar
没有在函数中定义)。
myvar
,即使存在具有相同名称的全局变量,在定义它之前也不能使用它)。此外,可以更改函数外的值,即,第65页末尾的文本也是不正确的。以下作品:
def funky(): # local
myvar = 20
print(myvar) # -> 20
myvar = 10 # global and/or local (outside funky())
funky()
print(myvar) # -> 10 (note: the same)
,
def funky(): # global
global myvar
print(myvar) # -> 10
myvar = 20
myvar = 10
funky()
print(myvar) # -> 20 (note: changed)
,
def funky(): # free (global if funky is not nested inside an outer function)
print(myvar) # -> 10
myvar = 10
funky()
,
def outer():
def funky(): # nonlocal
nonlocal myvar
print(myvar) # -> 5
myvar = 20
myvar = 5 # local
funky()
print(myvar) # -> 20 (note: changed)
outer()
Python "假设"我们需要一个局部变量,因为在funky()中赋值给myvar,所以第一个print语句抛出## UnboundLocalError:赋值前引用的局部变量'myvar' ##错误消息。在函数内部更改或创建的任何变量都是局部变量,如果它没有被声明为全局变量的话。要告诉Python我们想要使用全局变量,我们必须使用关键字"global",如下例所示:
def f():
global s
print s
s = "That's clear."
print s
s = "Python is great!"
f()
print s