为什么不将具有相同值的列表指向python中的相同内存位置?

时间:2019-09-28 21:43:38

标签: python python-3.x list

请考虑以下内容:

var1 = 'test test'
var2 = 'test test'

list1=[10,12,12,"Test"]

list2=[10,12,12,"Test"]

print(id(var1) == id(var2)) # True
print(id(list1) == id(list2)) # False

此布尔表达式给出False。这意味着list1和list2的存储位置不同。为什么具有相同值的变量指向相同的内存位置,而列表却指向不同的位置?

3 个答案:

答案 0 :(得分:6)

列表是可变的。您不想更改一个表面上独立的列表,而修改另一个巧合的相同列表。

另一方面,字符串是不可变的。您无法对var1进行更改,以免影响var2,因此可以共享基础对象。请注意,不能保证两个str文字产生相同的对象。何时以及是否发生这种缓存取决于实现。

答案 1 :(得分:2)

具有相同值的变量具有相同的id的事实是基础实现的产物。例如,小整数被插入;以及常见的字符串和显示为标识的字符串。这样做的好处是-由于字符串和整数是不可变的-每次使用都可以引用相同的内存位置,从而减少了内存消耗。

但是,并非所有的“相等”值都是“相同的”。您的问题中提到的两个列表是相互独立的。仅为了节省少量内存,就必须检测两个对象是否恰好相等,并且一旦它们变得不相等就必须将它们分开。

这是造成混淆的常见原因,请参见foo is "bar"中的字符串比较,而不是foo == "bar"中的字符串比较。如果"bar"被禁闭,似乎 可以在CPython上工作。但是,在其他口译员之间的比较将始终为假,

答案 2 :(得分:2)

由于字符串在Python中是不可变的,因此对象相同与否没有区别-共享对象是Python应用的优化。由于列表可以修改,因此无法做到这一点。

相关问题