Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.2.2错误局部变量_Python_Python 3.x - Fatal编程技术网

Python 3.2.2错误局部变量

Python 3.2.2错误局部变量,python,python-3.x,Python,Python 3.x,这段代码给出了Python 3.2中的以下错误: 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中的以下错误:

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. "))

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

这可能是由于函数内部存在
gCharlie=
(注意:第一个字母是
g

使用参数而不是全局参数:

UnboundLocalError: local variable 'gCharlie' referenced before assignment   

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

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

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

bob(charlie=3)
在不告诉python您正在使用globals的情况下,它尝试引用本地gCharlie和gJeff变量,正如它所说的,这些变量在函数中的那个点上还没有赋值。人们让它工作的原因是因为他们只使用你发布的代码。只有在引用全局变量的函数中不更改全局变量的值时,才可以引用全局变量而不显式地这样说

python通常按以下顺序搜索变量名:local scope、嵌套在其中的任何def、global和内置。因为gJeff和gCharlie是函数中的局部变量,除非你告诉它,否则它就到此为止

如果你想看到这一点,试着看看这个

def Bob():
    global gCharlie
    global gJeff
    Charlie=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()

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

前面的两个答案都是正确的,但都有点不清楚。我将用一些例子来说明:

您显示的代码可以正常工作:

in main(1):  5 
in function:  0
in main(2):  5
所以这根本不是问题所在。但是,不能在函数内分配全局变量:

>>> gCharlie = "Global!"
>>> 
>>> def foo():
...     print(gCharlie)
... 
>>> foo()
Global!
>>> print(gCharlie)
Global!
如您所见,全局变量gCharlie没有改变。这是因为您没有修改它,而是创建了一个同名的新局部变量。这就是错误的原因:

>>> gCharlie = "Global!"
>>> def foo():
...     gCharlie = "Local!"
...     print(gCharlie)
... 
>>> foo()
Local!
>>> print(gCharlie)
Global!
正如您现在看到的,您修改了全局变量


也就是说,全局变量通常是个坏主意。避开它们。尝试将变量作为参数传入。

我自己运行了这段代码,但没有收到这样的错误。可能提供调用此函数的代码?它在一个单独的文件中吗?如果是,您将如何导入它?等等。我在两个不同版本的Python中尝试了上述方法,它运行得非常完美。“默认情况下,它无法识别全局变量。”这是一种误导,例如,在模块级别通过导入某个模块引入的每个模块名都是一个普通的全局变量,显然可以在任何函数中使用。如果不在函数内更改它们的绑定,则不需要
global
。如果您确实需要它,那么您可能应该将函数重构为方法,将全局函数重构为实例属性。在
main()
内部调用
useX()
不需要
global useX
。你说得对。我的意思是,为了他,第一部分要简化。我把这些都删掉了,所以现在应该是好的。
>>> 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
>>> gCharlie = "Global!"
>>> def foo():
...     global gCharlie
...     oldCharlie = gCharlie
...     gCharlie = "Local!"
...     print(gCharlie)
... 
>>> foo()
Local!
>>> print(gCharlie)
Local!