In Python what is a global statement?

后端 未结 5 1334
情书的邮戳
情书的邮戳 2020-11-28 09:36

What is a global statement? And how is it used? I have read Python\'s official definition;
however, it doesn\'t make a lot of sense to me.

相关标签:
5条回答
  • 2020-11-28 09:37

    Basically it tells the interpreter that the variable its given should be modified or assigned at the global level, rather than the default local level.

    0 讨论(0)
  • 2020-11-28 09:39

    Every "variable" in python is limited to a certain scope. The scope of a python "file" is the module-scope. Consider the following:

    #file test.py
    myvariable = 5  # myvariable has module-level scope
    
    def func():
        x = 3       # x has "local" or function level scope.
    

    Objects with local scope die as soon as the function exits and can never be retrieved (unless you return them), but within a function, you can access variables in the module level scope (or any containing scope):

    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()
    

    However, you can't use assignment on that reference and expect that it will be propagated to an outer scope:

    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
    

    Now, we're finally to global. The global keyword is the way that you tell python that a particular variable in your function is defined at the global (module-level) scope.

    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
    

    In other words, you can change the value of myvariable in the module-scope from within func if you use the global keyword.


    As an aside, scopes can be nested arbitrarily deep:

    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()
    

    Now in this case, none of the variables are declared at the global scope, and in python2, there is no (easy/clean) way to change the value of x in the scope of func1 from within func3. That's why the nonlocal keyword was introduced in python3.x . nonlocal is an extension of global that allows you to modify a variable that you picked up from another scope in whatever scope it was pulled from.

    0 讨论(0)
  • 2020-11-28 09:41

    You can use a global variable in other functions by declaring it as global in each function that modifies it

    Python wants to make sure that you really know that's what you're playing with by explicitly requiring the global keyword.

    See this answer

    0 讨论(0)
  • 2020-11-28 09:55
    a = 1
    
    def f():
        a = 2 # doesn't affect global a, this new definition hides it in local scope
    
    a = 1
    
    def f():
        global a
        a = 2 # affects global a
    
    0 讨论(0)
  • 2020-11-28 10:00

    mgilson did a good job but I'd like to add some more.

    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]
    

    Inside a function, Python assumes every variable as local variable unless you declare it as global, or you are accessing a global variable.

    list1.append(2) 
    

    was possible because you are accessing the 'list1' and lists are mutable.

    list2 = [222]
    

    was possible because you are initializing a local variable.

    However if you uncomment #list1 = [9], you will get

    UnboundLocalError: local variable 'list1' referenced before assignment
    

    It means you are trying to initialize a new local variable 'list1' but it was already referenced before, and you are out of the scope to reassign it.

    To enter the scope, declare 'list1' as global.

    I strongly recommend you to read this even though there is a typo in the end.

    0 讨论(0)
提交回复
热议问题