我有一些代码:
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 :(得分:3)
因为second = first
没有制作副本。它使second
和first
两个引用同一个对象。
答案 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
。