列表项在排序/复制后保留相同的内存地址

时间:2015-06-08 14:08:35

标签: python list

我最近对列表如何在内部工作感到困惑。此代码跟踪项目的内存地址' 1'在一些操作后的这些列表中:

a = [1, 0, 2]
b = sorted(a)
c = b[:]

print id(a[0])  
print id(b[1])  # Same memory address
print id(c[1])  # Same memory address

地址在三个列表中保持不变。所有列表如何包含相同的项目' 1'?

4 个答案:

答案 0 :(得分:4)

Python在内部缓存小整数(最多256个)。

a = 1
b = 1
assert a is b

c = 257
d = 257
assert c is d  # raises AssertionError

答案 1 :(得分:1)

在内部(CPython),list对象存储对它包含的Python对象的引用。因此,将一个列表的内容添加到另一个列表不会创建新对象。它只会增加引用计数。

答案 2 :(得分:1)

添加@LukaszR之上。答案。

虽然小整数共享相同的ID,但复制的列表不会。

所以:

>>> a = [1,2,3]
>>> b = a[:]
>>> c = a
>>> id(a[0]) == id(b[0])
True
>>> id(a) == id(b)
False
>>> id(c) == id(a)
True

答案 3 :(得分:1)

>>> a=5
>>> id(a)
13897976 #newly created object id
>>> b = 5

这次python找到5个整数对象,如果它找到5只是它将另一个名称标记为5(在它上面标记为b)。

>>> id(b)
13897976 # existing 5 integer object id

>>> list1= [25, 5, 0, 'python']

当您将对象分配给列表时创建列表时也会发生相同的情况,如果python找到对象,它会在内存中搜索对象,它只是将列表索引标记到该对象。如果不是,它将为该对象创建新的内存

>>> list1[1]
5
>>> id(list1[1])
13897976 # existing 5 integer object id
>>> p= 'python'
>>> id(p)
139673134424000
>>> id(list1[3])
139673134424000

字典函数和代码中也会发生同样的事情。 更多信息click