【问题标题】:Why + and += is different?为什么 + 和 += 不同?
【发布时间】:2021-01-03 05:05:05
【问题描述】:

我有一个这样的列表:

numlist = [1,2,3]

但是,我知道我不能这样做:numlist += 1

因为它会引发TypeError: 'int' object is not iterable

我必须这样做numlist += 1,So it will make a tuple

但是为什么呢?:

>>> numlist = [1,2,3]
>>> numlist += 1,
>>> numlist
[1, 2, 3, 1]

不报错。

我的问题

我是用变量做的,但如果我这样做:

[1,2,3] + 1,

我明白了

TypeError: can only concatenate list (not "int") to list

为什么如果我执行list + 1, 会出错,但如果我执行variablecontainslist += 1, 则不会出错?

还有,

[1,2,3] + (1,)

给予

TypeError: can only concatenate list (not "tuple") to list

【问题讨论】:

  • 这是因为+ 的优先级高于,+= 的优先级较低。
  • 那是因为你试图将元组添加/连接到列表中,这是不允许的。
  • 另外,来自文档:“对于列表,iadd 相当于在列表上调用扩展并返回列表。这就是为什么我们说对于列表,+= 是list.extend 的“简写”
  • 结束@Rysicin 的想法-.extend 接受任何可迭代的,而不仅仅是其他列表。
  • @ppwater 我只想指出,所有关于优先级的讨论都不相关,但你可能已经收集到了。

标签: python


【解决方案1】:

试试这个:

x = []                 # empty list
x += "hello"           # iterates over the string and appends to list
print(x)               # ['h', 'e', 'l', 'l', 'o']

x = []                 # empty list
x = x + "hello"        # TypeError: can only concatenate list (not "str") to list

+= 运算符调用__ iadd__() 列表方法,而+ 一个调用__ add__() 一个。他们用列表做不同的事情。 += 向变量添加一个数字,在过程中更改变量本身(而 + 不会)。

【讨论】:

  • 他们用列表做不同的事情。什么? (只是好奇)
  • 比较 +=.extend() 可能会有用。
  • iadd 改变了 add 没有的列表这一事实并不是造成差异的原因。
【解决方案2】:

这里缺乏对称性。使用 list 时,x += y 基本上是 x.extend(y)extend 可用于任何可迭代对象。

extend(self, iterable, /)
    Extend list by appending elements from the iterable.

但是x = x + y 的限制更大。如果x 是一个列表,那么y 也必须是一个列表。 list.__add__ 方法知道两个对象的大小和结构,因此它可以有效地创建新的list。我不确定为什么实施者没有为增强加法保留这些相同的限制。但是将__iadd__ 转换为extend 很容易,而且功能很酷。

对于[1,2,3] + 1,,这个表达式创建了一个元组,但它在第一个元素上失败了。如果这是一个没有失败的操作,你会得到元组。

>>> [1,2,3] + [4],
([1, 2, 3, 4],)

【讨论】:

    猜你喜欢
    • 2014-04-04
    • 2015-05-14
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 2019-03-07
    相关资源
    最近更新 更多