为什么我得到这个输出? (Python,引用相等)

时间:2015-06-03 04:01:00

标签: 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

3 个答案:

答案 0 :(得分:3)

因为second = first没有制作副本。它使secondfirst两个引用同一个对象。

答案 1 :(得分:1)

实际上问题出在second = first,在执行此语句之后,没有新的变量或引用被创建到其他对象,而second正指向与{{1}相同的内存位置}}。因此,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

答案 2 :(得分: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