Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.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中的全局变量和名称错误_Python_Global Variables_Nameerror - Fatal编程技术网

Python中的全局变量和名称错误

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:

以下程序给出了错误信息:

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:
            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“噢,恶心”;完全有效的使用(对我来说是新的,-谢谢!)。。但我真的希望这个答案的核心是,潜在的混淆范围应该被认为是不合适的,而不是使用关键字来澄清它!您应该在此处使用
非本地
,而不是
全局