2015-06-03 3 views
0

У меня есть некоторый код:Почему я получаю этот вывод? (Python, ссылка равенство)

first = ['a','b'] 
second = first 
second.append('c') 
print('Test results: ',first == second, first is second) 

который возвращает Test results: True True. Я ожидал получить False False. Я подумал, что, поскольку second.append('c') путем добавления 'c', две переменные хранятся различные объекты - это означает first = ['a','b'] и second = ['a','b','c']

Почему я получаю True True?

+0

Вы хотите 'second = first [:]' как копию. – squiguy

+0

Возможный дубликат [Как клонировать или копировать список в Python?] (Http://stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list-in-python) – squiguy

+0

@squiguy Спасибо за предложение, однако я не хочу изменять свой код, я просто пытаюсь понять какое-то понимание всей вещи равенства. – ASm

ответ

3

Потому что second = first не делает копию. Он составляет second и first две ссылки на один и тот же объект.

1

На самом деле проблема заключается в second = first, после выполнения этого заявления, нет никаких новых переменный или ссылки, созданная в какой-то другой объект вместо second наведен точно на то же место памяти, как first. Таким образом, любые изменения, сделанные в second, в конечном счете отражается в first, а также:

first = [1, 2, 3] 
second = first 
print second 
>>> [1, 2, 3] 

second.append(4) 
print second 
>>> [1, 2, 3, 4] 

print first 
>>> [1, 2, 3, 4] 

Чтобы избежать таких проблем, вы deepcopy инициализировать новый список.

from copy import deepcopy 
a = [1, 2, 3] 
b = deepcopy(a) 
b.append(4) 
print b 
>>> 1, 2, 3, 4 
print a 
>>> 1, 2, 3 
0

Вариант № 1 - здесь ссылки сравниваются вместо значения

first = ['a','b'] 
second = first 
second.append('c') 
print('Test results: ',first == second, first is second) 
## >> result : it will always return TRUE 

Здесь я рекомендую использовать first is second для отдельного элемента массива, чем на весь массив, хотя Python не остановит вас от делать что ,

Вариант № 2 - его более подходящим способом

print cmp(second, first) 
## >> result : it will return 0 i.e. False 

Вариант № 3 - использовать Numpy массив

print np.array_equal(first, second) 
## >> result : it will return False too. 

Вы можете также использовать deepcopy, как объяснено ZdaR в ответе выше.