2012-06-20 4 views
2

У меня странное поведение из цикла for в python. Проблема заключается не в точности это один, но очень похоже на:Как изменить этот питон для цикла?

a = [] 
b = [1,2,3,4] 
for i in xrange (0,10): 
    a.append(b) 
    b[3] += 1 

И результат:

a = [[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14]] 

В результате я жду это

a = [[1,2,3,4],[1,2,3,5],[1,2,3,6],[1,2,3,7],.....,[1,2,3,14]] 

Я не знаю, почему на каждой итерации b [3] добавляется до 14, а затем список [1,2,3,14] добавляется к a. Я думаю, что b [3] должно увеличиваться только на 1 на каждой итерации

+2

Это происходит потому, что вы присоединяя ссылки на '' b' к Ā' на каждой итерации цикла, а не на копию 'b'. Каждая ссылка указывает на тот же 'b', который в конце вашего цикла имеет' b [3] = 14'. – Chris

+3

Попробуйте вставить код в [этот визуализатор кода python] (http://people.csail.mit.edu/pgbovine/python/tutor.html#mode=edit), чтобы увидеть, что именно происходит. –

+0

Так как я могу это исправить? – cuongptnk

ответ

7

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

Самым простым способом исправить это изменить добавляемых к

a.append(list(b)) 

Это сделает каждую итерацию присоединять (неглубокий) скопировать в целевой массив, вместо ссылки.

4

b доступен по ссылке, поэтому, когда вы изменяете b[3], это влияет на каждую ссылку, которую вы добавили к a снова и снова. Чтобы это исправить, нужно просто создать новую копию b каждый раз:

a = [] 
b = [1,2,3,4] 
for i in xrange (0,10): 
    a.append(b[:]) 
    b[3] += 1 
+0

list (b) - гораздо более дружелюбный синтаксис для b [:] –

2

вы можете использовать deepcopy:

from copy import deepcopy 
a = [] 
b = [1,2,3,4] 
for i in xrange (0,10): 
    a.append(deepcopy(b)) 
    b[3] += 1 
Смежные вопросы