python - iadd 运算符 ( += ) 与简单加法有何不同?

标签 python syntax

<分区>

我一直认为 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 可能不是“真正的”加法,但我仍然希望解释器将它们视为等同的。

最佳答案

如您所知,第一个代码 (mylist += random.sample(range(100),2)) 就地修改了列表。 p>

这两个:

mylist = mylist + ...
mylist = mylist[:-2]

创建一个名为 mylist对象,然后赋予它与之前的 mylist 相同的值(或从中派生的值)。

由于这个原因,后一行没有恢复原始列表;它正在创建一个新副本,并单独保留原始引用。

您可以通过更改列表来获得所需的行为:

mylist[:] = mylist[:-2]

关于python - iadd 运算符 ( += ) 与简单加法有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18892040/

相关文章:

python - 如何检查一个列表是否包含另一个列表的 2 个元素?

python - 仅获取 Pandas groupby 中组的匹配行

c++ - 这个函数的参数在哪里?

复杂查询的 MySQL 语法错误

python - 找到给定约束的最大索引差异

python - ipython 中有没有办法始终在启动时运行导入?像 'from __future__ import division' 吗?

python - 如何在类里面简化分数?

javascript代码错误语法

C++变量命名

php - Mysql 语法错误...或者是 PHP?