任何熟悉 Python 内部结构(CPython 或其他实现)的人都可以解释为什么列表添加必须是同质的:
In [1]: x = [1]
In [2]: x+"foo"
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
C:\Users\Marcin\<ipython-input-2-94cd84126ddc> in <module>()
----> 1 x+"foo"
TypeError: can only concatenate list (not "str") to list
In [3]: x+="foo"
In [4]: x
Out[4]: [1, 'f', 'o', 'o']
为什么上述内容不应该返回与上述成绩单中x+"foo"
的最终值相同的值?x
这个问题来自 NPE 的问题:Python's list += iterable 的行为是否记录在任何地方?
更新:我知道不需要异构+=
工作(但确实如此),同样,不需要异构工作+
是错误的。这个问题是关于为什么做出后一种选择。
说将序列添加到列表中的结果是不确定的,这太过分了。如果这是一个充分的反对意见,那么防止异质+=
. 更新 2:特别是,python 总是将运算符调用委托给左侧操作数,因此不会出现“什么是正确的事情”的问题:左侧对象总是管理(除非它委托给右侧)。
更新 3:对于任何争论这是一个设计决定的人,请解释 (a) 为什么它没有记录在案;(b) 记录在案的地方。
Update4:“应该[1] + (2, )
返回什么?” 它应该返回一个结果值,该值等于x
最初保持[1]
在 之后的变量的值x+=(2, )
。这个结果是明确定义的。