我正在学习Python。一本关于Python 3的书说下面的代码应该可以正常工作:
def funky():
print(myvar)
myvar = 20
print(myvar)
myvar = 10
funky()
但是当我在Python 3.3中运行它时,我得到了
UnboundLocalError: local variable 'myvar' referenced before assignment
错误。我的理解是print(myvar)
中的第一个funky
应该是10,因为它是一个全局变量。第二个print(myvar)
应为20,因为本地myvar
定义为20.这里发生了什么?请帮助澄清。
答案 0 :(得分:8)
在分配值之前,您需要在函数中调用global
。
def funky():
global myvar
print(myvar)
myvar = 20
print(myvar)
myvar = 10
funky()
请注意,您可以在不调用全局的情况下打印该值,因为您可以在不使用global
的情况下访问全局变量,但尝试分配值将需要它。
答案 1 :(得分:2)
来自the docs:
程序文本中每次出现的名称都指的是绑定 在最里面的功能块中建立的名称 使用
这意味着除非您声明它global
或nonlocal
(嵌套函数),否则myvar
是局部变量或自由变量(如果myvar
未定义功能)。
这本书不正确。在同一个块中,名称表示相同的变量(示例中的局部变量myvar
,即使存在具有相同名称的全局变量,也不能在定义它之前使用它。此外,您可以更改函数外的值,即the text at the end of page 65 is also incorrect。以下作品:
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()
答案 2 :(得分:0)
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