2012-04-13 2 views
3
# coding: utf-8 

def func(): 
    print 'x is', x 
    #x = 2 #if I add this line, there will be an error, why? 
    print 'Changed local x to', x 
x = 50 
func() 
print 'Value of x is', x 
  1. Я не добавить в функции Func global x, но он все еще может найти x 50, почему?
  2. Когда я добавляю строку x=2 в функцию func, будет ошибка (UnboundLocalError: local variable 'x' referenced before assignment), почему?
+0

Какая ошибка? – Marcin

+0

@Marcin, если я добавлю x = 2, ошибка: «UnboundLocalError: локальная переменная« x », на которую ссылаются перед присвоением» –

+0

Затем поместите это в свой вопрос. – Marcin

ответ

5

Хитрость здесь в том, что локальные имена обнаружено статически:

  • пока имя x не назначаются в функции, ссылки на x решимости т он глобальный масштаб
  • Если имя x присваивается где-нибудь в функции, Python предполагает, что x Таким образом, местное название везде в функции. Как следствие, первая строка становится ошибкой, потому что перед назначением используется локальное имя x.

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

4

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

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

+1

Downvoter: Что вы считаете неправильным? – Marcin

3

Python использует довольно типичный variable scoping. Нелокальные переменные видны внутри функции.

Вам нужно только ключевое слово global, если вы хотите назначить переменную в глобальной области видимости. Также вы должны отметить разницу между глобальной и внешней областью. Рассмотрим последствия:

x = 'global' 
def f(): 
    x = 'local in f' 
    def g(): 
     global x 
     x = 'assigned in g' 
    g() 
    print x 

После выполнения f() выше код будет печатать local in f, а x в глобальном масштабе устанавливается в 'assigned in g'.


По состоянию на Python 3, есть также nonlocal ключевых слов, что позволяет присваивание переменной из внешней области.

x = 'global' 
def f(): 
    x = 'local in f' 
    def g(): 
     nonlocal x 
     x = 'assigned in g' 
    return g 
    print(x) 

После выполнения f() выше кода будет печатать «назначен в г (which is the value of х in local scope of п() ), while value of x` в глобальном масштабе остается нетронутым.

Стоит также отметить, что Python использует лексическую (статическую) область видимости, таким образом, следующий код делает не модификации x в глобальном масштабе:

x = 'global' 
def f(): 
    x = 'local in f' 
    def g(): 
     nonlocal x 
     x = 'assigned in g' 
    return g 
g = f() 
g() 
+1

Если вы хотите обсудить технические достоинства чего-то, сделайте это конструктивно и зрелым. Не входите в кидиш-зов и сражайтесь. Благодарю. – BoltClock

+0

@ BoltClock'saUnicorn Я не вижу неуважения, которые вы упомянули в этом ответе. oh..wait (проверяет английский словарь для «типичного») ah .. tehre это - похоже, что это слово имеет отрицательное родство на английском языке, оно не получается на других языках - Vartec, будучи неродным носителем, вероятно, не был осознавая это. «« 1. «Являясь или выступая в качестве типичного примера определенного типа, характерная картина - типичный Рембрандт 2. считается примером какой-то нежелательной черты, которая типична для вас!» «»} (Collins dict) - во всем мире, первое значение более распространено) – jsbueno

+0

(Я отредактировал ответ, чтобы удалить оскорбительное слово) – jsbueno

Смежные вопросы