2015-07-24 4 views
-1

Я думал, что глобальные переменные внутри функции Python должны быть объявлены глобальными. Итак, почему следующая компиляция и запуск без ошибок?Глобальная переменная, используемая внутри метода экземпляра без «глобального»

#!/usr/bin/env python 
text = "why is this seen?" 
class Foo: 
    def doit(self): 
     print(text) 
x = Foo() 
x.doit() 

Я бы по достоинству оценил ссылку на руководство Python3, если это возможно.

+0

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

ответ

2

Вы запросили ссылку на руководство Python 3. Я выделил раздел, в котором говорится, что вам не нужно использовать ключевое слово global для ссылки на свободные переменные.

https://docs.python.org/3/reference/simple_stmts.html?highlight=global#grammar-token-global_stmt

7,12. Глобальное заявление

global_stmt :: = «глобальный» идентификатор («» идентификатор) *

глобальное утверждение является заявление, которое имеет место в течение всего текущего блока кода . Это означает, что перечисленные идентификаторы равны , которые интерпретируются как глобальные. Было бы невозможно присвоить глобальную переменную без глобальных, хотя свободные переменные могут ссылаться на глобальные глобальные значения , не объявляемые глобальными.

Обратите внимание, что в большей части коды всех классов и функций, которые вы Ссылочные Глобал (или) встроенные команды, но вы не думали дважды о необходимости не global print перед вызовом.

1

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

#!/usr/bin/env python 
text = "why is this seen?" 
class Foo: 
    def doit(self): 
     text = "this is changed" 
     print(text) 

x = Foo() 
x.doit() 
print text 

В приведенном выше примере, мы перезаписать переменную text локально, в Foo, класс, но глобальный экземпляр текста одно и то же. Но в данном случае:

#!/usr/bin/env python 
text = "why is this seen?" 
class Foo: 
    def doit(self): 
     global text 
     text = "this is changed" 
     print(text) 

x = Foo() 
x.doit() 
print text 

Мы заявляем, что мы хотим версию текста global, а затем мы можем изменить его.

НО: global переменных неодобрение, рассмотреть возможность использования входных аргументов для функций и возвращения новых значений вместо того, чтобы переменные глобально доступных везде

Правильного способ сделать это:

#!/usr/bin/env python 

class Foo: 
    text = "why is this seen?" 
    def doit(self): 
     print(self.text) 

x = Foo() 
x.doit() 

Есть text инкапсулирован в классе!

+1

Чтобы добавить к этому, ключевое слово 'global' должно использоваться только для __change__ глобальной переменной за пределами текущей области. – muddyfish

+0

@muddyfish спасибо за добавление: D – heinst

+2

@muddyfish Чтобы добавить к этому, это считается очень нерегулярным используйте 'global'. Ваша первая попытка должна состоять в том, чтобы использовать значения 'return', используя глобальные только тогда, когда это необходимо. – SuperBiasedMan

0

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

Здесь Python будет выглядеть в рамках класса Foo первой переменной text.Так как он не находит переменную text в классе Foo, он будет искать внешний вид. Теперь он находит переменную text, поэтому он использует это значение для печати результата.

Согласно Python docs, в любой момент во время выполнения, есть по крайней мере три вложенных области видимости, чьи пространства имен непосредственно доступны:

  1. сокровенная сфера, которая ищется первым, содержит локальные имена
  2. Области любых закрывающих функций, поиск которых начинается с ближайшей охватывающей области, содержит нелокальные, но также и неглобальные имена
  3. следующая последняя область содержит глобальный Имена
  4. наружный сфера (поиск в прошлом) является пространством имен, содержащих встроенные имена
Смежные вопросы