我最近对列表如何在内部工作感到困惑。此代码跟踪项目的内存地址' 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'?
答案 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