为何 Python3 要搞一个不可变对象的概念?

2021-05-06 14:51:25 +08:00
 James369
首先,python 在函数传递参数时,都是传递引用(因为无论传入整数 int 还是列表 list,本质都是类对象)。

那么 int 作为不可变对象我还可以理解,比如下面的行为很正常:

b1 = 3
print(id(b1)) #4321884528
b1 += 4
print(id(b1)) #4321884656,id 变了,正常。
b1 = b1 + 4
print(id(b1)) #4321884784,id 变了,也正常。

但是,换成可变对象 list,就有点诡异了:

a1 = [1, 2, 3]
print(id(a1)) #4358212608
a1 += ['aa', 'bb']
print(id(a1)) #4358212608,id 没变,正常
a1 = a1 + ['aa', 'bb']
print(id(a1)) #4357527936,id 怎么就变了呢,这有点变得莫名其妙了?

按正常理解,x += y,应该等同于 x = x + y,这么一搞,这个特性就有点匪夷所思了。
1941 次点击
所在节点    Python
3 条回复
aldslvda
2021-05-06 15:08:33 +08:00
+= 用的是__iadd__
+ 用的是__add__
Jirajine
2021-05-06 15:17:49 +08:00
a1 += ['aa', 'bb'] 可以 desugar 成 add_to(a1,['aa','bb']),a1 = a1 + ['aa', 'bb'] 则是 a1 = add(a1,['aa','bb'])
区别是显而易见的。
est
2021-05-06 15:25:34 +08:00
一楼正解。你可以完全把 + 定义成不变的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/775170

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX