【问题标题】:Why list can not be concatenated with str using '+' operator in python?为什么不能在 python 中使用“+”运算符将列表与 str 连接?
【发布时间】:2020-06-23 06:38:55
【问题描述】:

我想了解list +='a'list=list+'a' 之间的区别 例如,如果我这样做:

li=[]
for i in 'string':
    li+=i

我没有收到错误,但如果我使用第二个选项,按照惯例应该是相同的,但会出错

li=[]
for i in 'string':
    li=li+i

TypeError:只能将列表(不是“str”)连接到列表

正确的做法是这样的:

li=[]
for i in 'string':
    li=li+[i]

我想知道+= 操作员是如何工作的?它如何能够在列表中获取字符串,是否将字符串转换为列表?

【问题讨论】:

标签: python list concatenation


【解决方案1】:

我想知道 += 运算符是如何工作的?

就地赋值+= 运算符有两种工作方式(来自docs):

1)对于不可变对象

对于字符串、数字和元组等不可变目标, 更新的值被计算,但没有分配回输入变量

这意味着每次使用+= 时都会创建一个新对象(如果您的对象是不可变的)

2)对于可变对象

对于列表和字典等可变目标,就地 方法将执行更新,因此没有后续分配 必要的

这意味着您不会在每次使用+= 时创建一个新对象(如果您的对象是可变的)


在您的示例中,要使用li+=i,您必须确保i 是一个列表,否则将不起作用

这里:

li = []
for i in 'string':
    li = li + [i]

您正在连接 2 个列表,但每次创建新列表 li 时,您可以使用内置函数 id 进行检查:

li=[]
for i in '1':
    print(id(li))
    li=li+[i]
    print(id(li))

输出:

140661631713104
140661644452240

您可以像这样使用就地赋值+= 运算符:

li=[]
for i in '1':
    print(id(li))
    li += [i]
    print(id(li))

输出:

140661641698592
140661641698592

如您所见,元素被附加到 li 列表中,而无需创建更有效的新 li 列表,这与 list.extend 的工作方式相同

要将另一个元素添加到您的列表中,而不是使用列表,您可以使用list.append

【讨论】:

  • 您的回答很有道理,但仍然是一个非常奇怪的设计选择,尤其是来自另一种语言,其中a+=a 等价于a= a+a
【解决方案2】:

Python 文档说:

要了解为什么会发生这种情况,您需要知道 (a) 如果一个对象实现了一个 __iadd__ 魔术方法,它会在执行 += 扩展赋值时被调用,它的返回值为赋值语句中使用了什么; (b) 对于列表,__iadd__ 相当于在列表上调用 extend 并返回列表。这就是为什么我们说对于列表,+= 是 list.extend 的“简写”

由于 list.extend 需要一个迭代器并且一个字符串是可迭代的,+= 在您给定的示例中有效。这意味着,您甚至不需要 for 循环,因为 list.extend 将遍历字符串并将元素添加到列表中。
li=[] li += "string" 输出:['s', 't', 'r', 'i', 'n', 'g']

列表只能连接 (+) 列表。

来源:
https://docs.python.org/3/tutorial/datastructures.html https://docs.python.org/3/reference/datamodel.html#emulating-numeric-types https://docs.python.org/3/faq/programming.html#faq-augmented-assignment-tuple-error

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 2017-09-24
    相关资源
    最近更新 更多