Python中的全局变量和局部变量

时间:2013-01-20 04:42:08

标签: python function python-3.x global-variables

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

3 个答案:

答案 0 :(得分:8)

在分配值之前,您需要在函数中调用global

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

myvar = 10
funky()

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

答案 1 :(得分:2)

来自the docs

  

程序文本中每次出现的名称都指的是绑定   在最里面的功能块中建立的名称   使用

这意味着除非您声明它globalnonlocal(嵌套函数),否则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