考虑以下日志:
>> y = 20000
>> id(y)
36638928
>> y = 1000000
>> id(y)
36639264
如您所见,在更改y的值后,它的id也发生了变化。这是否意味着int是不可变的?背后发生了什么呢?
谢谢!
如您所见,在更改y的值后,它的id也发生了变化。这是否意味着int是不可变的?背后发生了什么呢?
谢谢!
是的,整数是不可变的。你需要意识到:
变量只是一个名称,用于引用对象。
20000
和1000000
是两个独特的整数对象。这意味着它们永远不会同时共享相同的内存地址。
简单来说,当您执行此行代码时:
y = 20000
发生了两件事:
在对象空间中创建了一个整数对象20000
。
在命名空间中创建了一个名为y
的名称,并指向该对象。
当您执行以下代码时:
y = 1000000
接下来会发生两件事情:
在对象空间中创建一个新的整数对象1000000
。
将名称y
的指向更改为该对象,而不是20000
。
x=10
,y=10
然后 id(x) != id(y)
,但事实并非如此,每个整数只有一个实例,x 和 y 都引用它。 - cmdint
类型的数据有时会被存储在缓存中,但这种情况并不是语言定义的一部分;例如,在某些机器上(比如cpython 2.7.6),1000 is 1000
返回True,但1000 is not (999 + 1)
返回False。 - SingleNegationEliminationy
的名称,并指向在对象空间中创建的对象20000
”_,因为这实际上是发生的事情,并且是Python中的一个独特区别。变量不是“用于容纳东西的盒子”(这就是为什么它们在Python中被称为名称而不是变量)。 - Burhan Khalid
y
中的值,而是将一个新的值分配给了y
。即使该值是可变的,这也会更改id
。 - tobias_kint
是不可变对象无关。关键在于赋值语句右侧是不同的对象,这才是重点。 - Reinstate Monica