Использование ключевого слова "global" в Python

Что я понимаю из чтения документации, так это то, что у Python есть отдельное пространство имен для функций, и если я хочу использовать глобальную переменную в этой функции, мне нужно использовать global.

Я использую Python 2.7, и я пробовал этот небольшой тест

>>> sub = ['0', '0', '0', '0']
>>> def getJoin():
...     return '.'.join(sub)
...
>>> getJoin()
'0.0.0.0'

Кажется, что все работает нормально даже без global. Я смог получить доступ к глобальной переменной без каких-либо проблем.

Я что-то пропустил? Кроме того, следующее из документации Python:

Имена, перечисленные в глобальном заявлении не должны определяться как формальные параметров или в элементе управления петлей цель, определение класса, функция определение или импорт.

В то время как формальные параметры и определение класса имеют для меня смысл, я не могу понять ограничение на назначение и определение функции управления контуром.

Ответ 1

Ключевое слово global полезно только для изменения или создания глобальных переменных в локальном контексте, хотя создание глобальных переменных редко считается хорошим решением.

def bob():
    me = "locally defined"    # Defined only in local context
    print me

bob()
print me     # Asking for a global variable

Вышеупомянутое даст вам:

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

Если вы используете оператор global, переменная станет доступной "вне" области действия функции, фактически став глобальной переменной.

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

bob()
print me     # Asking for a global variable

Таким образом, приведенный выше код даст вам:

locally defined
locally defined

Кроме того, из-за природы python вы также можете использовать global для объявления функций, классов или других объектов в локальном контексте. Хотя я бы советовал против этого, поскольку он вызывает кошмары, если что-то пошло не так или требует отладки.

Ответ 2

Пока вы можете обращаться к глобальным переменным без ключевого слова global, если вы хотите их изменить, вы должны использовать ключевое слово global. Например:

foo = 1
def test():
    foo = 2 # new local foo

def blub():
    global foo
    foo = 3 # changes the value of the global foo

В вашем случае вы просто получаете доступ к списку sub.

Ответ 3

Это разница между доступом к имени и привязкой к нему в пределах области.

Если вы просто просматриваете переменную, чтобы прочитать ее значение, у вас есть доступ как к глобальной, так и локальной области.

Однако, если вы назначаете переменную, имя которой не находится в локальной области, вы привязываете это имя к этой области (и если это имя также существует как глобальное, вы это скроете).

Если вы хотите назначить глобальное имя, вам нужно сказать, что синтаксический анализатор использует глобальное имя, а не связывает новое локальное имя - это то, что делает ключевое слово "global".

Связывание в любом месте блока приводит к тому, что имя во всем этом блоке становится привязанным, что может вызвать некоторые довольно странные последствия (например, UnboundLocalError неожиданно появляется в предыдущем рабочем коде).

>>> a = 1
>>> def p():
    print(a) # accessing global scope, no binding going on
>>> def q():
    a = 3 # binding a name in local scope - hiding global
    print(a)
>>> def r():
    print(a) # fail - a is bound to local scope, but not assigned yet
    a = 4
>>> p()
1
>>> q()
3
>>> r()
Traceback (most recent call last):
  File "<pyshell#35>", line 1, in <module>
    r()
  File "<pyshell#32>", line 2, in r
    print(a) # fail - a is bound to local scope, but not assigned yet
UnboundLocalError: local variable 'a' referenced before assignment
>>> 

Ответ 4

Другие ответы отвечают на ваш вопрос. Еще одна важная вещь, которую нужно знать о именах на Python, заключается в том, что они являются локальными или глобальными по всей видимости.

Рассмотрим это, например:

value = 42

def doit():
    print value
    value = 0

doit()
print value

Вероятно, вы можете догадаться, что оператор value = 0 присваивает локальной переменной и не влияет на значение той же переменной, объявленной вне функции doit(). Вы можете быть более удивлены, обнаружив, что приведенный выше код не будет работать. Значение print value внутри функции создает UnboundLocalError.

Причина в том, что Python заметил, что в другом месте функции вы назначаете value имени, а также value нигде не объявляется global. Это делает его локальной переменной. Но когда вы пытаетесь распечатать его, локальное имя еще не определено. Python в этом случае не возвращается к поиску имени как глобальной переменной, как это делают некоторые другие языки. По сути, вы не можете получить доступ к глобальной переменной, если вы определили локальную переменную с тем же именем в любой точке функции.

Ответ 5

Доступ к имени и присвоение имени различны. В вашем случае вы просто получаете доступ к имени.

Если вы назначаете переменную внутри функции, эта переменная считается локальной, если вы не объявите ее глобальной. В отсутствие этого предполагается, что он глобальный.

>>> x = 1         # global 
>>> def foo():
        print x       # accessing it, it is global

>>> foo()
1
>>> def foo():   
        x = 2        # local x
        print x 

>>> x            # global x
1
>>> foo()        # prints local x
2

Ответ 6

  • Вы можете получить доступ к глобальным ключевым словам без ключевого слова global
  • Чтобы иметь возможность изменять их, вам необходимо явно указать, что ключевое слово глобально. В противном случае ключевое слово будет объявлено в локальной области.

Пример:

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]

Ответ 7

Любая переменная, объявленная вне функции, считается глобальной, она только при объявлении их изнутри функций (кроме конструкторов), которые должны указывать, что переменная является глобальной.

Ответ 8

Это означает, что вы не должны делать следующее:

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"

Ответ 9

Global делает переменную "Global"

def out():
    global x
    x = 1
    print(x)
    return


out()

print (x)

Это означает, что 'x' действует как нормальная переменная вне функции. Если вы выберете глобальное значение, это приведет к ошибке, поскольку не может напечатать переменную внутри функции.

def out():
     # Taking out the global will give you an error since the variable x is no longer 'global' or in other words: accessible for other commands
    x = 1
    print(x)
    return


out()

print (x)

Ответ 10

я дам вам простой пример: подумайте об этом коде:

myVar = 0 
print (myVar )      # 01 line: returns 0

def func():
    myVar  = "def"
    print (myVar )

func()              # 02 line: returns def
print (myVar )      # 03 line: returns 0

так как вы можете видеть, что последняя строка кода вернет 0, потому что внутри функции переменная myVar не была переназначена, ее только что было изменено, и она изменится только тогда, когда вызванная функция не влияет на основную переменную myVar, поскольку она определена внутри наша функция (означает, что это локальная переменная), но с использованием глобального ключевого слова как такового:

 myVar  = 0 
print (myVar )       # 01 Line : returns 0

def func():
    global myVar 
    myVar  = "def"
    print (myVar )

func()               # 02 Line : returns def
print (myVar )       # 03 Line : returns def

мы фактически заказываем python, что эта переменная внутри def не является локальной, используйте глобальную переменную с именем myVar, как ее изменить.