2013-11-24 4 views
1

Это очень простая проблема, но я понятия не имею, почему это делает python. Для цикла ниже if head != None... создает локальную переменную, так что head += 1 не изменяет головку в for head in myHeap.array. добавив печать (голова) сразу после того, как голова + = 1 производит результат, который я хочу, но голова вне оператора if остается неизменной.Область переменной Python для цикла

for head in myHeap.array: 
     if head != None and count % int(grow) == 0: 
      head += 1 

поэтому вход myHeap.array = [2, 2, 2, 1] выводит один и тот же список в конце итерации, когда [3, 3, 3, 2], как ожидается. Я также проверил, что условие выполнено для оператора if, и интерпретатор использует строку head += 1

ответ

5

Вам необходимо будет получить доступ к элементам списка myHeap.array, чтобы изменить их. Что-то вроде этого:

class myHeap(object): 
    pass 

myHeap.array = [2, 2, 2, 1] 

for n, head in enumerate(myHeap.array): 
    if head != None: 
     myHeap.array[n] = head + 1 

print myHeap.array 

выход:

[3, 3, 3, 2] 
1

Выполнить это и внимательно посмотреть на идентификаторами сгенерированных.

listt = [2, 3] 

for i in listt: 
    print(id(i)) 
    i += 1 
    print(id(i)) 
    print() 

print(listt) 
print() 

for i in range(len(listt)): 
    print(id(listt[i])) 
    listt[i] += 1 
    print(id(listt[i])) 
    print() 

print(listt) 

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

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