【发布时间】:2012-12-04 00:12:29
【问题描述】:
任何熟悉 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 的问题:Is the behaviour of Python's list += iterable documented anywhere?
更新:我知道异构+= 不需要工作(但确实如此),同样,异构+ 也不需要是错误。这个问题是关于为什么做出后一种选择。
说将序列添加到列表中的结果是不确定的,这太过分了。如果这是一个充分的反对意见,那么防止异构+= 将是有意义的。更新 2:特别是,python 总是将运算符调用委托给左侧操作数,因此不会出现“什么是正确的事情”的问题:左侧对象始终管理(除非它委托给右侧)。
更新 3:对于任何认为这是一个设计决定的人,请解释 (a) 为什么它没有记录在案;或 (b) 记录在案的地方。
Update4:“[1] + (2, ) 应该返回什么?”它应该返回一个与变量x 的值相等的结果值,该变量最初在x+=(2, ) 之后立即持有[1]。这个结果是明确定义的。
【问题讨论】:
标签: python language-design language-implementation python-internals