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
这个局部变量错误是什么意思?
答案 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编译器已将其标记为局部变量。因此,您可以在它存在之前访问它。使用nonlocal
或global
来解决。
答案 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!
如您所见,您修改了全局变量。
也就是说,全局变量通常是一个坏主意。避免他们。尝试将变量作为参数传递。