我对可变对象和不可变对象之间的区别有点困惑。我尝试了以下代码块来查找对象的 id:
tuple1 = ('Object1', 'Object2')
print id(tuple1)
tuple2 = ('Object1', 'Object2')
print id(tuple2)
list1 = ['Object1', 'Object2']
print id(list1)
list2 = ['Object1', 'Object2']
print id(list2)
string1 = "Foo bar"
print id(string1)
string2 = "Foo bar"
print id(string2)
Run Code Online (Sandbox Code Playgroud)
我的字符串有相同的 id,列表有不同的 id,但元组有不同的 id。他们不应该有相同的id吗?我想知道是否有人可以解释它是如何工作的?
谢谢
相同的 ID 意味着完全相同的对象,但 Python 的实现可以随意优化不可变对象的创建。例如,在 CPython 2.6.6 中,会缓存小整数对象,因此:
>>> x=256
>>> x is 256
True
>>> x=1024
>>> x is 1024
False
[NOTE: 'is' tests for object identity (same ID)]
Run Code Online (Sandbox Code Playgroud)
无法保证此结果在其他实现中也相同。实现可以缓存不可变的元组,但是哪些元组是常见的?如果按照您的建议,所有相同的元组返回相同的 id,那么程序创建的所有元组都必须被缓存,并且每个新创建的元组都必须搜索缓存以查看它之前是否已创建,这将是耗时。
用于==测试对象相等性,无论 ID 如何。