我一直认为x += 1
这只是语法速记(并且完全等同于)x = x + 1
,直到我花了一段时间试图弄清楚为什么这段代码没有按预期运行:
[ipython/euler 72 ]$ def func(mylist):
mylist += random.sample(range(100),2)
# do stuff with the random result, then restore original list
mylist = mylist[:-2]
它应该返回它得到的相同列表,但它似乎不是这样工作的:
[ipython/euler 81 ]$ x = [1,2,3]
[ipython/euler 82 ]$ func(x)
[1, 2, 3, 23, 7]
[ipython/euler 83 ]$ func(x)
[1, 2, 3, 23, 7, 42, 36]
[ipython/euler 84 ]$ func(x)
[1, 2, 3, 23, 7, 42, 36, 0, 5]
如果我将赋值语句更改为长格式mylist = mylist + ...
,它会按预期工作并保持列表不变。
为什么会这样?我认为这与列表是可变的有关,并且当作为列表的重载方法调用时 iadd 可能不是“真正的”加法,但我仍然希望解释器将它们视为等效的。