请考虑以下内容:
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的存储位置不同。为什么具有相同值的变量指向相同的内存位置,而列表却指向不同的位置?
答案 0 :(得分:6)
列表是可变的。您不想更改一个表面上独立的列表,而修改另一个巧合的相同列表。
另一方面,字符串是不可变的。您无法对var1
进行更改,以免影响var2
,因此可以共享基础对象。请注意,不能保证两个str
文字产生相同的对象。何时以及是否发生这种缓存取决于实现。
答案 1 :(得分:2)
具有相同值的变量具有相同的id
的事实是基础实现的产物。例如,小整数被插入;以及常见的字符串和显示为标识的字符串。这样做的好处是-由于字符串和整数是不可变的-每次使用都可以引用相同的内存位置,从而减少了内存消耗。
但是,并非所有的“相等”值都是“相同的”。您的问题中提到的两个列表是相互独立的。仅为了节省少量内存,就必须检测两个对象是否恰好相等,并且一旦它们变得不相等就必须将它们分开。
这是造成混淆的常见原因,请参见foo is "bar"
中的字符串比较,而不是foo == "bar"
中的字符串比较。如果"bar"
被禁闭,似乎 可以在CPython上工作。但是,在其他口译员之间的比较将始终为假,
答案 2 :(得分:2)
由于字符串在Python中是不可变的,因此对象相同与否没有区别-共享对象是Python应用的优化。由于列表可以修改,因此无法做到这一点。