2014-12-25 2 views
2

Я думал, что понял, как Python обрабатывает копии переменных, но я столкнулся с следующим поведением.Изменение копии списка, изменяет оригинал

x = [i for i in xrange(5)] 
mylist = [x, x] 

mylist_copy = mylist[:] 

mylist_copy[0].pop() 

mylist 

Out : [[0, 1, 2, 3], [0, 1, 2, 3]] 

Так что, похоже, mylist изменился, несмотря на изменения, которые вносятся только mylist_copy. Как создать чистую копию mylist, чтобы этого не произошло?

ответ

3

В то время как вы действительно делаете копию, это мелкой копии: mylist_copy содержит ссылки на оригинал x.

Чтобы сделать глубокую копию, используйте copy.deepcopy().

1

Это происходит не из-за каких-либо ошибок при копировании при создании mylist_copy, а потому, что mylist состоит из двух одинаковых элементов.

mylist = [x,x] adds two references to the same object (`x`). 

В результате mylist[0].pop() будет иметь тот же результат:

In [70]: x = [i for i in range(5)] 

In [71]: mylist = [x,x] 

In [72]: mylist 
Out[72]: [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4]] 

In [73]: mylist[0].pop() 
Out[73]: 4 

In [74]: mylist 
Out[74]: [[0, 1, 2, 3], [0, 1, 2, 3]] 

Вот один из способов обойти эту проблему:

In [80]: x = [i for i in range(5)] 

In [81]: mylist = [x, x[:]] 

In [82]: mylist_copy = mylist[:] 

In [83]: mylist_copy[0].pop() 
Out[83]: 4 

In [84]: mylist 
Out[84]: [[0, 1, 2, 3], [0, 1, 2, 3, 4]] 
Смежные вопросы