在Python中使用+和+=运算符进行连接



python-3.x list (1)

最近,我注意到在连接列表时出现了不一致。

因此,如果我使用 + 运算符,它不会将列表与任何不同类型的对象连接起来。 例如。,

l = [1,2,3]
l = l + (4,5)        #TypeError: can only concatenate list (not "tuple") to list

但是,如果我使用 + = 运算符,它会忽略对象的类型。 例如。,

l = [1,2,3]
l += "he"            #Here, l becomes [1, 2, 3,"h", "e"]

l += (56, 67)        #Here, l becomes [1, 2, 3,"h", "e", 56, 67]

那么,它只是语言的语义还是其他一些原因?


基本思想是 ++= 运算符在Python中不一定是相同的操作,它们对于列表确实不同。 + 操作由 __add__ 魔术方法执行,而 += 操作由 __iadd__ (就地添加)魔术方法执行。 这些神奇的方法来自运算符左侧的类型。

列表的就地添加不需要右侧的列表,只需要一个可迭代的列表。 然后,这些项目将从迭代中逐个获取并附加到列表中。 这类似于list的 extend 方法。 因此 += 运算符不会 忽略 右侧对象的类型,它只是 扩展 了可以使用的可能类型。

这种行为有点令人困惑 - 它必须是因为你是两天内的第二个人,我已经看到在这个问题上提出类似(但不重复)的问题。 但是,这种行为很方便 - 我们现在有一种简单的方法可以将列表与任何可迭代组合在一起。

有关这方面的更多信息,请参阅 为什么Python列表会让你+ =一个元组,当你不能+一个元组?

正如@ khelwood的评论所述, a += b 的结果类型是显而易见的: a += b 的类型。 所以 b 的类型可以是灵活的。 结果类型的 a + b 不明显。 Python是一种严格类型的语言,并且讨厌这种模糊性。 Python 禅宗 陈述

显式优于隐式。

面对模棱两可,拒绝猜测的诱惑。

虽然实用性胜过纯洁。

所以当前的行为非常适合Python的Zen。 我注意到Zen中没有任何关于一致性的内容。





concatenation