在 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 运算符