4

我正在学习 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。这里发生了什么?请帮助澄清。

4

3 回答 3

8

您需要global在分配值之前调用您的函数。

def funky():
    global myvar
    print(myvar)
    myvar = 20
    print(myvar)

myvar = 10
funky()

请注意,您可以在不调用 global 的情况下打印该值,因为您可以在不使用 的情况下访问全局变量global,但尝试分配值将需要它。

于 2013-01-20T04:53:25.447 回答
2

文档

程序文本中每次出现的名称指的是在包含使用的最内层功能块中建立的该名称的绑定。

这意味着除非您声明它globalnonlocal(嵌套函数) ,否则它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()
于 2013-01-20T06:01:14.740 回答
0

由于在 funky() 中对 myvar 的赋值,Python“假设”我们想要一个局部变量,因此第一个 print 语句抛出 ## UnboundLocalError: local variable 'myvar' referenced before assignment ## 错误消息。如果未将其声明为全局变量,则在函数内部更改或创建的任何变量都是局部变量。要告诉 Python,我们要使用全局变量,我们必须使用关键字“global”,如下例所示:

def f():
  global s
  print s
  s = "That's clear."
  print s 


s = "Python is great!" 
f()
print s
于 2014-09-24T08:14:07.533 回答