Python 3.2.2错误局部变量

时间:2012-01-23 03:46:47

标签: python python-3.x

gCharlie = 0
gJeff = 0

def Bob ():
    Charlie = gCharlie
    Jeff = gJeff
    Number = int(input("Hello and Welcome to Charlie's Number Guessing Game. Enter a nonnegative number from 0 to 10 not counting 0. "))

这段代码在Python 3.2中给出了这个错误:

UnboundLocalError: local variable 'gCharlie' referenced before assignment   

这个局部变量错误是什么意思?

4 个答案:

答案 0 :(得分:3)

在你的函数的范围内你必须重新分配gJeff和gCharlie,它们将它们创建为新的局部变量。要告诉python您正在使用全局变量,请将函数的顶部更改为如下所示。

def Bob():
    global gCharlie
    global gJeff
    Charlie=gCharlie

没有告诉python您正在使用全局变量,它会尝试引用本地gCharlie和gJeff变量,正如它所说,在函数中的那个点上没有分配。人们开始工作的原因是因为他们只使用了您发布的代码。如果你不在引用它们的函数中改变它们的值,你可以在没有明确说明的情况下引用全局变量。

通常,python按此顺序搜索变量名称:本地范围,任何def嵌套在其中的全局内置函数。因为gJeff和gCharlie是函数中的局部变量,它会在那里停止,除非你另有说明。

如果你想看到这个,请试着看看这个

 x=5

 def useX():
     x=0     #this is a local variable
     print "in function: ", x

 def main():
     print "in main(1): ", x
     useX()
     print "in main(2): ", x

 main()

这将输出

in main(1):  5 
in function:  0
in main(2):  5

因为在函数中,x被创建为新的局部变量。将全局x语句添加到useX函数将更改最后一行以打印" 0"而不是" 5"

答案 1 :(得分:2)

可能是因为函数内部有gCharlie =(注意:第一个字母是g)。

使用参数代替全局:

def bob(charlie=0, jeff=0):
    number = int(input("..."))
    # ...

bob(charlie=3)

答案 2 :(得分:2)

这意味着您在未显示的函数部分中分配gCharlie,因此Python编译器已将其标记为局部变量。因此,您可以在它存在之前访问它。使用nonlocalglobal来解决。

答案 3 :(得分:1)

此前的两个答案都是正确的,但两者都有点不清楚。我将展示一些例子:

您展示的代码可以正常运行:

>>> gCharlie = "Global!"
>>> 
>>> def foo():
...     print(gCharlie)
... 
>>> foo()
Global!
>>> print(gCharlie)
Global!

所以这根本不是问题。但是,您不能在函数内分配全局变量:

>>> gCharlie = "Global!"
>>> def foo():
...     gCharlie = "Local!"
...     print(gCharlie)
... 
>>> foo()
Local!
>>> print(gCharlie)
Global!

如您所见,全局变量gCharlie没有改变。这是因为您没有修改它,您创建了一个具有相同名称的新局部变量。这就是错误的原因:

>>> gCharlie = "Global!"
>>> def foo():
...     oldCharlie = gCharlie
...     gCharlie = "Local!"
...     print(gCharlie)
... 
>>> foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in foo
UnboundLocalError: local variable 'gCharlie' referenced before assignment

提示是错误的。它说 local 变量gCharlie。问题不在于无法访问全局gCharlie,而是尚未创建本地gCharlie。

修复是指定您不想创建局部变量,而是要修改全局变量。您可以使用global关键字执行此操作。

>>> gCharlie = "Global!"
>>> def foo():
...     global gCharlie
...     oldCharlie = gCharlie
...     gCharlie = "Local!"
...     print(gCharlie)
... 
>>> foo()
Local!
>>> print(gCharlie)
Local!

如您所见,您修改了全局变量。

也就是说,全局变量通常是一个坏主意。避免他们。尝试将变量作为参数传递。