Python中的全局变量和名称错误
以下程序给出了错误信息: NameError:未定义名称“n”Python中的全局变量和名称错误,python,global-variables,nameerror,Python,Global Variables,Nameerror,以下程序给出了错误信息: NameError:未定义名称“n” def g(): n=7 def f(): global n if n==7: n=7 return f() g() 有人能帮我理解这是什么意思吗?在g()函数中插入一个全局变量 def g(): global n n=7 def f(): global n if n==7:
def g():
n=7
def f():
global n
if n==7:
n=7
return f()
g()
有人能帮我理解这是什么意思吗?在
g()
函数中插入一个全局变量
def g():
global n
n=7
def f():
global n
if n==7:
n=7
return f()
g()
关于何时会发生这种情况,一个更为简化的版本是
n = 10
def g():
n+=1
g()
您现在不能修改n。但是如果我们像这样在函数中添加全局
n = 10
def g():
global n
n+=1
g()
print(n)
我们得到了预期的输出
11
但是需要记住的一点是,如果我们只是打印变量,则不必添加全局变量。大致上说:不要这样做…并尽量使你的范围尽可能明显 通常情况下,新类或dict(在全局范围内创建时已经是全局的和可变的)就是这种情况
shared={}
定义a():
共享['x']=5
def inner():
如果共享.get('x')==5:
共享['x']=6
打印(共享['x'])
内()
()
%python3 test.py
6.
问题是global n
指的是全局范围,而不是g
的范围(除非修改n
,否则f
已经可以访问该范围)
这可能导致一些令人惊讶的结果
#/usr/bin/env蟒蛇3
#test.py
定义a():
x=1
def display():
打印(x)
显示()
def b():
x=1
def display():
打印(x)
x=1
显示()
()
b()
%python3 test.py
1.
回溯(最近一次呼叫最后一次):
文件“test.py”,第17行,在
文件“test.py”,第14行,在b中
显示文件“test.py”,第12行
UnboundLocalError:赋值前引用了局部变量“x”
n
实际上应该是全局的吗?因为它看起来更像是一个局部变量g
,这使得它在f
中是非局部的,而不是全局的。看到它的意思了吗?当你点击第行时,如果n==7
没有全局定义的n
。在这种情况下,使用非本地
否,使用非本地
@juanpa.arrivillaga“噢,恶心”;完全有效的使用(对我来说是新的,-谢谢!)。。但我真的希望这个答案的核心是,潜在的混淆范围应该被认为是不合适的,而不是使用关键字来澄清它!您应该在此处使用非本地
,而不是全局