如果列表中的元素指向相同的内存地址,那么这两个列表为什么不指向同一个对象



我初始化两个列表如下:

>>> 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

ab是不同的对象,因此id(a)不等于id(b)

a[0]常数1,等于b[0],并且它们的地址相同,以节省内存。

帮助这个帮助。

相关内容

  • 没有找到相关文章

最新更新