为了账号安全,请及时绑定邮箱和手机立即绑定

整数是不可变的还是可变的?

整数是不可变的还是可变的?

慕码人2483693 2022-12-20 13:57:11
Int 变量是不可变的。那么当一个整数类型被赋值给一个新的变量时,它应该创建一个新的对象,对吧?但它只会在对任一变量进行更改时创建一个新对象。整数不是不可变的吗?我错过了什么?谢谢!x = 5y = xprint(x is y)   #>>>True | So y is a reference.print(y)        #>>>5x +=1print(x is y)   #>>>False | now y is an object? Is that it? print(y)        #>>>5
查看完整描述

4 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

x并且y都是参考。

x = 5-x是对5

y = x-y也是对5

x += 1-x现在是对 的引用6y仍然是对 的引用5


查看完整回答
反对 回复 2022-12-20
?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

整数是不可变的。

当你写 x=5 时,x 指向一个包含 5 的内存位置。

当您继续编写 y=x 时,变量 y 指向与 x 相同的位置。

然后输入 x+1=6,现在 x 指向一个包含 6 的新位置,而不是之前的位置。(这里,整数仍然保持不变,因为原始整数 5 仍然存在,但变量 x 现在没有绑定到它。x 现在绑定到一个新位置。但 y 仍然绑定到整数 5)

但是 y 仍然指向与 5 相同的位置。

所以,整数仍然是不可变的,这就是它的工作原理。为了看得更清楚,在每一步之后使用 id(x) 或 id(y)。


查看完整回答
反对 回复 2022-12-20
?
慕森卡

TA贡献1806条经验 获得超8个赞

有两件事在起作用。首先,int 是可以绑定到多个变量的对象。其次,python缓存了一小群小整数,这些小整数往往会被大量使用以提高效率


x = 5       # get the cached `5` object and bind it to x

y = x       # take whatever object is bound to x and also bind it to y

x += 1      # take whatever object is bound to x, call its `__iadd__` 

            # method and bind the return value to x. `int.__iadd__`

            # adds the integers and since it is small, returns the

            # cached `6` object.

请注意,赋值不会创建新对象。它只是将对象的引用放入变量中,就像将键/值对添加到字典中一样。


查看完整回答
反对 回复 2022-12-20
?
慕少森

TA贡献2019条经验 获得超9个赞

这是一个图解说明。关键部分x += 1实际上是在内存中创建一个新对象,其值在x的旧引用加上16在这种情况下为 )。

//img1.sycdn.imooc.com//63a14eee0001bda006570911.jpg


查看完整回答
反对 回复 2022-12-20
  • 4 回答
  • 0 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信