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



我正在学习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:

程序文本中出现的每一个名称都指向的绑定的最内层函数块中建立的名称使用。

这意味着除非你声明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()

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

相关内容

  • 没有找到相关文章

最新更新