我在一个变量中存储一个值,在另一个变量中存储相同的值,然后它为这两个变量赋予相同的id。但是,如果我将一个变量和相同列表的列表限制为另一个变量,那么ID有何不同?
我的示例程序是:
>>> x=10
>>> y=10
>>> id(x)
21122368
>>> id(y)
21122368
>>> x=[1,2,3]
>>> y=[1,2,3]
>>> id(x)
35525896
>>> id(y)
35527736
答案 0 :(得分:2)
这是因为最流行的Python实现中的优化。基本上,小整数不是作为完整对象创建的,而是您接收对现有小整数的引用,并且每次都是相同的。
答案 1 :(得分:2)
一些不可变对象在python中缓存,一些数字和字符串就是一个例子。这意味着,当您编写1
时,您将获得对堆中已存在的对象的引用。
列表没有被缓存(没有意义,从它们可变的事实开始),因此它们具有不同的身份,尽管它们的内容可以相同。
也许有点比较有帮助。每个看月亮的人都会看到完全相同的月亮(这会引用1
)...因此你可以说
id(my_moon) == id(your_moon)
或只是
my_moon is your_moon
由于月亮是月亮,而1
是1
,因此出于性能原因,python的某些实现决定缓存此对象。
另一方面,可变对象是缓存的可怕候选者。例如,每个拿一袋薯条的人正在拿一袋薯条的不同实例,因此它可能在某些时候
my_chips == your_chips
因为它们具有相同数量的芯片,但在任何情况下都不会是
id(my_chips) == id(your_chips)
因为这意味着对象是共享的,当别人吃掉芯片(改变芯片袋对象)时,芯片会从你的包中消失......这将是一个可怕的生活世界:)