2016-10-17 1 views
0
A=[] 

def main(): 
    global A 
    A=[1,2,3,4,5] 
    b() 

def b(): 
    if(len(A)>0): 
     A=[7,8,9] 
    else: 
     if(A[3]==4): 
      A.remove(2) 

main() 

Этот код дает ошибку в строке A.remove (2) дают основанию: «UnboundLocalError: локальной переменной„A“, на который ссылается перед тем уступка»глобального переменного Python

но список является глобальным и что он имеет был инициализирован в функции main(). Пожалуйста, объясните, почему это дает ошибку?

Как было инициализировано снова в функции b, это приведет к ошибке?

+0

работает просто отлично для меня, на Python 3.4.3 и Python 2.7.12. – Li357

+1

Невозможно воспроизвести. Отлично работает для меня, Python 3.5. Это ваш настоящий код? Потому что, возможно, в вашем реальном коде есть что-то, что вы думаете, что не вызывает на самом деле проблемы. – idjaw

+0

Работает на python 2.7, 3.5 – Juggernaut

ответ

2

Причина вы получаете это потому, что, когда вы выполнили это задание в вашей функции:

A = [7, 8, 9] 

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

if(len(A)>0): 

будет на самом деле бросить свой первый UnboundLocalError исключение, потому что, в связи с тем, как уже упоминалось, вы никогда не объявлял global A в вашей b функции и вы также создал локально связанную переменную A = [7, 8, 9], вы пытаетесь использовать локальный A, прежде чем вы его объявите.

Вы на самом деле сталкиваются с той же проблемой при попытке сделать это:

A.remove(2) 

Чтобы решить эту проблему, по отношению к вашему коду, просто объявить global A обратно в b() функции.

def b(): 
    global A 
    if(len(A)>0): 
     A=[7,8,9] 
    else: 
     if(A[3]==4): 
      A.remove(2) 

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

A = [1, 2, 3, 4] 


def main(list_of_things): 
    # do whatever operations you want to do here 
    b(list_of_things) 

def b(list_of_things): 
    # do things with list_of_things 

main(A) 
+0

Не могли бы вы уточнить * почему * это порождает ошибку? – Li357

+0

@AndrewLi добавил некоторую ясность. – idjaw

0

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

def b(): 
    global A 
    if some_condition: 
     A.append(6) 
    else: 
     A.remove(2) 

без объявления Aglobal в пределах объема b(), Python предполагает, что A принадлежит в пространстве имен B(). Вы можете прочитать его, но не может изменить его (любые изменения не будут сохраняться в истиннойA.

Вы позволили установить А что-то внутри функции A = ... будет работать, но только в пределах функции.

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

по объявление Aglobal, интерпретатор знает, что вы хотите редактировать глобальную переменную.

Я предполагаю, что вы имеете в виду для вашего кода, чтобы посмотреть что-то вроде этого (В противном случае, он работает нормально)

A=[] 

if __name__ == '__main__': 
    def main(): 
     global A 
     A=[1,2,3,4,5] 
     b() 

    def b(): 
     global A 
     if some_condition: 
      A=[7,8,9] 
     else: 
      A.remove(2) 
     print A 

    main() 
    print A 

print A 

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

  • Нет связанных вопросов^_^