2013-06-08 3 views
3

Я сохраняю «haystack» во временной переменной, но когда я изменяю «haystack», меняется и временная переменная. Зачем? Помоги пожалуйста? это нормально? в PHP у меня не было этой проблемы.Как использовать временную переменную в Python 2.7 - memory

# -*- coding:utf-8 -*- 

haystack = [1,'Two',3] 
tempList = haystack 
print 'TempList='  
print tempList 
iterable = 'hello' 
haystack.extend(iterable) 
print 'TempList=' 
print tempList 

Вернуться в консоли

TempList= 
[1, 'Two', 3] 
TempList= 
[1, 'Two', 3, 'h', 'e', 'l', 'l', 'o'] 

Но я не изменил переменную 'TempList'.
Помогите, пожалуйста. Спасибо.

ответ

5

Вы не создаёте копию списка; вы просто создаете вторую ссылку на него.

Если вы хотите, чтобы создать временную (мелкий) копию, сделать это явно:

tempList = list(haystack) 

или использовать полный список срез:

tempList = haystack[:] 

Вы изменить изменяемый список на месте при вызове .extend() на объект, поэтому все ссылки на этот список будут видеть изменения.

Альтернативой является создание нового списка, используя конкатенацию вместо расширения:

haystack = [1,'Two',3] 
tempList = haystack # points to same list 
haystack = haystack + list(iterable) # creates a *new* list object 

Теперь переменная haystack был повторно связанный с новым списком; tempList все еще относится к старому списку.

+0

Хорошее объяснение. Альтернативой является просто не использовать методы mutating - вместо 'haystack.extend (iterable)' do 'haystack = haystack + list (iterable)' (или 'haystack = itertools.chain (haystack, iterable)', если вы этого не сделаете нужен список). – abarnert

3

tempList и haystack - это всего лишь два имени, которые вы связываете с тем же list. Сделайте копию:

tempList = list(haystack) # shallow copy 
1

Это классический пример разницы в поведении между списками и автономных переменных в Python. Это связано с тем, что tempList = haystack не копия значения стога сена до tempList, но присваивает адрес haystack по адресу tempList. То есть, теперь вы ссылаетесь на одно и то же место в памяти двумя именами. Таким образом, изменение одного изменяет другое. Для копирования значений вы можете сделать tempList = list(haystack).

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