Use of “global” keyword in Python

后端 未结 10 2454
既然无缘
既然无缘 2020-11-21 05:05

What I understand from reading the documentation is that Python has a separate namespace for functions, and if I want to use a global variable in that function, I need to us

相关标签:
10条回答
  • 2020-11-21 05:46

    The keyword global is only useful to change or create global variables in a local context, although creating global variables is seldom considered a good solution.

    def bob():
        me = "locally defined"    # Defined only in local context
        print(me)
    
    bob()
    print(me)     # Asking for a global variable
    

    The above will give you:

    locally defined
    Traceback (most recent call last):
      File "file.py", line 9, in <module>
        print(me)
    NameError: name 'me' is not defined
    

    While if you use the global statement, the variable will become available "outside" the scope of the function, effectively becoming a global variable.

    def bob():
        global me
        me = "locally defined"   # Defined locally but declared as global
        print(me)
    
    bob()
    print(me)     # Asking for a global variable
    

    So the above code will give you:

    locally defined
    locally defined
    

    In addition, due to the nature of python, you could also use global to declare functions, classes or other objects in a local context. Although I would advise against it since it causes nightmares if something goes wrong or needs debugging.

    0 讨论(0)
  • 2020-11-21 05:47
    • You can access global keywords without keyword global
    • To be able to modify them you need to explicitly state that the keyword is global. Otherwise, the keyword will be declared in local scope.

    Example:

    words = [...] 
    
    def contains (word): 
        global words             # <- not really needed
        return (word in words) 
    
    def add (word): 
        global words             # must specify that we're working with a global keyword
        if word not in words: 
            words += [word]
    
    0 讨论(0)
  • 2020-11-21 05:50

    The other answers answer your question. Another important thing to know about names in Python is that they are either local or global on a per-scope basis.

    Consider this, for example:

    value = 42
    
    def doit():
        print value
        value = 0
    
    doit()
    print value
    

    You can probably guess that the value = 0 statement will be assigning to a local variable and not affect the value of the same variable declared outside the doit() function. You may be more surprised to discover that the code above won't run. The statement print value inside the function produces an UnboundLocalError.

    The reason is that Python has noticed that, elsewhere in the function, you assign the name value, and also value is nowhere declared global. That makes it a local variable. But when you try to print it, the local name hasn't been defined yet. Python in this case does not fall back to looking for the name as a global variable, as some other languages do. Essentially, you cannot access a global variable if you have defined a local variable of the same name anywhere in the function.

    0 讨论(0)
  • 2020-11-21 05:52

    It means that you should not do the following:

    x = 1
    
    def myfunc():
      global x
    
      # formal parameter
      def localfunction(x):
        return x+1
    
      # import statement
      import os.path as x
    
      # for loop control target
      for x in range(10):
        print x
    
      # class definition
      class x(object):
        def __init__(self):
          pass
    
      #function definition
      def x():
        print "I'm bad"
    
    0 讨论(0)
提交回复
热议问题