我初始化两个列表如下:
>>> a = [1]
>>> b = [1]
然后,我在两个列表的索引0处找到元素的内存位置:
>>> id(a[0])
93961440619840
>>> id(b[0])
93961440619840
两个元素的地址相同。但当我试图找出两个列表是否都指向同一个对象时,我会得到"False">
>>> a is b
False
我的问题是,如果列表中的元素引用相同的内存,为什么列表中没有引用相同的对象?
我的问题是,如果列表的元素引用相同的内存,为什么列表不引用相同的对象?
因为列表是可变的对象,所以每个列表文字都有来创建一个全新的列表对象,独立于以前的每个列表对象^[0]。否则
>>> a = []
>>> b = []
>>> a.append(1)
>>> print(b)
会打印[1]
而不是空列表,这将是疯狂的。
id(a[0])
和id(b[0])
虽然是不同的文字,但它们是相同的原因是Python可以预先分配/实习生经常使用的不可变的对象,以降低内存消耗。
这是一个不能依赖的实现细节,因为它是特定实现的内部属性,可以随时更改。目前,CPython将预分配-5到256(包括在内(之间的所有整数,因此即使您通过独立的文字或计算创建它们,这些整数也将始终是相同的对象。
[0]从技术上讲,cpython(也是特定实现的内部细节(维护对象的自由列表,因此当列表是";收集的";它实际上是存储起来的,所以下次我们需要一个列表时可以重用分配,而不必重新分配和设置一个全新的列表。这意味着连续使用(但不是同时使用(的不同列表可以具有相同的id
,即使同时存在许多其他分配。
只有索引0处元素的内存位置相等,而不是整个列表的内存地址。
a[0] is b[0] # This returns True
整个列表的内存位置不同:您可以通过键入进行测试
id(a)
id(b)
Python这样做是为了减少内存使用
如果选中a[0] is b[0]
,则它将是True
。因为a[0]
和b[0]
的元素是相同的,这就是为什么这些id也是相同的。结果是CCD_ 9。
a = [1]
b = [1]
print(a[0] is b[0])
print(id(a[0]), id(a[0]))
# Output
# True
# 1793259440 1793259440
为什么a is b
为False?因为a和b是不同的列表,并且具有不同的id
print(a is b)
print(id(a), id(b))
# Output
# False
# 9997064 9997800
a
和b
是不同的对象,因此id(a)
不等于id(b)
但a[0]
是常数1
,等于b[0]
,并且它们的地址相同,以节省内存。
帮助这个帮助。