这是一个创建于 1396 天前的主题,其中的信息可能已经有所发展或是发生改变。
首先,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,这么一搞,这个特性就有点匪夷所思了。
第 1 条附言 · 2021-05-06 15:42:08 +08:00
经过查阅,发现不可变对象的一些优点,就是可以节省内存。比如:
a = 12
b = 12
a is b #True
s1 = 'abc'
s2 = 'abc'
s1 is s2 # True
3 条回复 • 2021-05-06 15:25:34 +08:00
 |
|
1
aldslvda 2021-05-06 15:08:33 +08:00 4
+= 用的是__iadd__ + 用的是__add__
|
 |
|
2
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']) 区别是显而易见的。
|
 |
|
3
est 2021-05-06 15:25:34 +08:00
一楼正解。你可以完全把 + 定义成不变的。
|