在Python中,什么是全局声明?

什么是全球声明 ? 它是如何使用的? 我读过Python的官方定义;
然而,这对我来说并没有多大意义。


python中的每个“变量”都被限制在一定范围内。 python“文件”的范围是模块范围。 考虑以下:

#file test.py
myvariable = 5  # myvariable has module-level scope

def func():
    x = 3       # x has "local" or function level scope.

具有局部作用域的对象只要函数退出并且永远不会被检索(除非您return它们),但在函数内,您可以访问模块级作用域(或任何包含作用域)中的变量:

myvariable = 5
def func():
    print(myvariable)  # prints 5

def func2():
    x = 3
    def func3():
        print(x)       # will print 3 because it picks it up from `func2`'s scope

    func3()

但是,您不能在该引用上使用赋值,并期望它将传播到外部作用域:

myvariable = 5
def func():
    myvariable = 6     # creates a new "local" variable.  
                       # Doesn't affect the global version
    print(myvariable)  # prints 6

func()
print(myvariable)      # prints 5

现在,我们终于走向globalglobal关键字是你告诉python你的函数中的一个特定变量是在全局(模块级)范围内定义的方式。

myvariable = 5
def func():
    global myvariable
    myvariable = 6    # changes `myvariable` at the global scope
    print(myvariable) # prints 6

func()
print(myvariable)  # prints 6 now because we were able 
                   # to modify the reference in the function

换句话说,如果使用global关键字,则可以在func内更改模块范围中myvariable的值。


顺便说一下,范围可以任意嵌套:

def func1():
    x = 3
    def func2():
        print("x=",x,"func2")
        y = 4
        def func3():
            nonlocal x  # try it with nonlocal commented out as well.  See the difference.
            print("x=",x,"func3")
            print("y=",y,"func3")
            z = 5
            print("z=",z,"func3")
            x = 10

        func3()

    func2()
    print("x=",x,"func1")

func1()

现在在这种情况下,没有一个变量在全局范围内声明,并且在python2中,没有(简单/干净)的方式在func3更改func1范围内的x的值。 这就是为什么nonlocal关键字在python3.x介绍。 nonlocalglobal的扩展,它允许你修改从另一个范围中取出的变量,这个变量是从任何范围中取出的。


mgilson做得很好,但我想补充一些。

list1 = [1]
list2 = [1]

def main():
    list1.append(3)
    #list1 = [9]
    list2 = [222]

    print list1, list2


print "before main():", list1, list2
>>> [1] [1]
main()
>>> [1,3] [222]
print list1, list2    
>>> [1, 3] [1]

在函数内部,Python会将每个变量假定为局部变量,除非将其声明为全局变量,或者您正在访问全局变量。

list1.append(2) 

是可能的,因为你正在访问'list1'并且列表是可变的。

list2 = [222]

是可能的,因为你正在初始化一个局部变量。

但是,如果您取消注释#list1 = [9],您会得到

UnboundLocalError: local variable 'list1' referenced before assignment

这意味着你正试图初始化一个新的局部变量'list1',但它之前已经被引用过了,你不在范围之内来重新分配它。

要输入范围,请将'list1'声明为全局。

即使最后有错字,我也强烈建议您阅读。


基本上它告诉解释者,它的给定变量应该在全局级被修改或分配,而不是默认的本地级。

链接地址: http://www.djcxy.com/p/1603.html

上一篇: In Python what is a global statement?

下一篇: purpose of 'if