在 Python 中使用 + 和 += 运算符进行连接 [重复]

Posted

技术标签:

【中文标题】在 Python 中使用 + 和 += 运算符进行连接 [重复]【英文标题】:Concatenation using the + and += operators in Python [duplicate] 【发布时间】:2019-11-23 08:08:03 【问题描述】:

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

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

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]

那么,仅仅是语言的语义还是其他原因?

【问题讨论】:

如果您将+ 与不同类型的操作数一起使用,那么您期望的结果是什么类型存在歧义。使用+=,暗示左操作数确定结果的类型。 += 列表或多或少相当于list.extend() 【参考方案1】:

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

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

这种行为有点令人困惑——这一定是因为你是两天内我见过的第二个人就这个问题提出类似(但不重复)的问题。但是,这种行为很方便——我们现在有一种简单的方法可以将列表与任何可迭代对象结合起来。

有关更多信息,请参阅Why do Python lists let you += a tuple, when you can’t + a tuple?。


正如@khelwood 的评论所述,a += b 的结果类型很明显:a 的类型。所以b的类型可以很灵活。 a + b 的结果类型并不明显。 Python 是一种严格类型的语言,讨厌这种歧义。 Zen of Python 状态

显式优于隐式。

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

虽然实用胜于纯粹。

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

【讨论】:

Java 有类似的东西。

以上是关于在 Python 中使用 + 和 += 运算符进行连接 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Python ODBC 中使用 Microsoft Access SQL 运算符

Python 中使用的 & 和竖线字符在哪里?

Python字符串

如何在 python 中使用 % 方法和条件运算符?

如何在 Rust Diesel 中使用时间戳和间隔进行算术运算

在Python中使用“is”或“==”进行数字比较更好吗? [复制]