理解Python的内存模型

3
考虑以下日志: >> y = 20000 >> id(y) 36638928 >> y = 1000000 >> id(y) 36639264
如您所见,在更改y的值后,它的id也发生了变化。这是否意味着int是不可变的?背后发生了什么呢?
谢谢!

1
是的,它是不可变的,它只是将一个新变量赋给名称“y”。请随意在网上搜索这些内容,已经有很多在线资源了。 - Loïc Faure-Lacroix
4
您没有更改存储在 y 中的值,而是将一个新的值分配给了 y。即使该值是可变的,这也会更改 id - tobias_k
2
我建议每个Python程序员都阅读http://bit.ly/pynames(真的)。 - Wooble
3
这与 int 是不可变对象无关。关键在于赋值语句右侧是不同的对象,这才是重点。 - Reinstate Monica
1个回答

6

是的,整数是不可变的。你需要意识到:

  1. 变量只是一个名称,用于引用对象。

  2. 200001000000是两个独特的整数对象。这意味着它们永远不会同时共享相同的内存地址。

简单来说,当您执行此行代码时:

y = 20000

发生了两件事:

  1. 在对象空间中创建了一个整数对象20000

  2. 在命名空间中创建了一个名为y的名称,并指向该对象。

当您执行以下代码时:

y = 1000000

接下来会发生两件事情:

  1. 在对象空间中创建一个新的整数对象1000000

  2. 将名称y的指向更改为该对象,而不是20000


我看到你做的了! - Loïc Faure-Lacroix
这让它听起来像是 x=10y=10 然后 id(x) != id(y),但事实并非如此,每个整数只有一个实例,x 和 y 都引用它。 - cmd
4
这句话的意思是,int类型的数据有时会被存储在缓存中,但这种情况并不是语言定义的一部分;例如,在某些机器上(比如cpython 2.7.6),1000 is 1000返回True,但1000 is not (999 + 1)返回False。 - SingleNegationElimination
说实话,如果先出现的那个数字被释放了并且不再被引用,20000和100000可能在不同的时间结束时存储在内存的相同位置。 - Wooble
这不是“将整数对象作为值给定”的说法 - 正确的短语是_“在命名空间中创建一个名为y的名称,并指向在对象空间中创建的对象20000”_,因为这实际上是发生的事情,并且是Python中的一个独特区别。变量不是“用于容纳东西的盒子”(这就是为什么它们在Python中被称为名称而不是变量)。 - Burhan Khalid
好的,我会再加入一些细节。不过,我之前尝试让回答对提问者来说非常简单易懂。我认为一个过于详细的回答只会更加让他困惑。 - user2555451

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接