2016-03-07 3 views
-1

Я обнаружил, что при выполнении for цикл над списком изменяемых элементов Я не могу изменить этот элемент, однако я могу изменить элемент этого элемента, если этот элемент изменен. Зачем?Невозможно изменить элемент списка внутри цикла цикла

# Create alist which contain mutable 
alist = [[1, 2, 3],] 

#1 For loop 
for x in alist: 
    x = x + [9,] 
print alist 
# let's replace alist[0] to list which contain another one and try to modify it 
alist[0] = [[[1,2],3]] 

print2 alist # [[[[1, 2], 3]]] 
#2 For loop 
for x in alist: 
    x[0] = x[0] + [9,] 
# list modified ... 
print alist # [[[[1, 2], 3, 9]]], Modified ! 

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

+1

взглянуть на этот HTTP: //stackoverflow.com/questions/2022031/python-append-vs-operator-on-lists-why-do-these-give-different-results. – AKS

+0

@AKS спасибо, посмотрим на это –

ответ

0

Причиной такого поведения является то, что при выполнении для контура # 1 нового списка производится путем применения + оператора к списку (его можно отслеживать путем получения id из x).

Однако в для цикла № 2 элементом доступа к элементу с индексом x[0] объект, который уже в памяти изменяется. Его можно легко найти по телефону id по х в то время как итерация alist

# Create alist which contain mutable 
alist = [[1, 2, 3],] 

#1 for loop 
for x in alist: 
    print id(x), id(alist[0]), 'Same?:', id(x) == id(alist[0]) 
    # id(x): 4425690360 id(alist[0]) 4425690360 Same?: True 
    x = x + [9,] 
    print id(x), id(alist[0]), 'Same?:', id(x) == id(alist[0]) 
    # id(x): 4425770696 id(alist[0]) 4425690360 Same?: False 
# mutable item not modified, so my guess is that x actually are copy of that item 
print alist # [[1, 2, 3]] 
# let's replace alist[0] to list which contain another one and try to modify it 
alist[0] = [[[1,2],3]] 

print alist 
#2 for loop 
for x in alist: 
    print id(x), id(alist[0]), 'Same?:', id(x) == id(alist[0]) 
    # id(x): 4425811008 id(alist[0]) 4425811008 Same?: True 

    x[0] = x[0] + [9,] 
    print id(x), id(alist[0]), 'Same?:', id(x) == id(alist[0]) 
    # id(x): 4425811008 id(alist[0]) 4425811008 Same?: True 
# list modified ... 
print alist # [[[[1, 2], 3, 9]]] 

Для решения проблемного array.append изменить элемент в цикл, см образец ниже:

alist = [[1, 2, 3],] 
for x in alist: 
    print id(x), id(alist[0]), 'Same?:', id(x) == id(alist[0]) 
    x.append(9) 
    print id(x), id(alist[0]), 'Same?:', id(x) == id(alist[0]) 
# list modified ... 
print alist # [[1, 2, 3, 9],] 
Смежные вопросы