"list += str" 和 "list.append(str)" 有什么区别?(关于 IT 技术方面的提问)

3
今天我在进行一些Python列表操作时注意到了一种奇怪的行为。
假设:
a = []
b = 'xy'

当我执行 a += b 时,解释器返回:
a += b
a == ['x', 'y']

但是当我使用逗号(a+=b,)时,解释器会返回a = ['xy']。

a += b,
a == ['xy']

请问有人能解释这里发生了什么吗?


@wim - 你能解释一下这个问题与链接问题不重复的原因吗? - TigerhawkT3
@TigerhawkT3 当然,这是因为a += b不是list.extend(a, b)(尽管结果相似)。实际上更像是a = a.__iadd__(b) - wim
@wim - 我认为它更像是 list.extend,因为 list.__iadd__ 修改了列表并返回它,而 list.extend 仅修改了列表但不返回它,而像 a += b 这样的赋值语句不会像其他一些语言那样返回其分配的值。 - TigerhawkT3
@TigerhawkT3 不,你在作用域方面错过了一个微妙之处。当你执行a+=b时,list.__iadd__修改列表并返回它,并且返回的对象再次绑定。要看为什么+=不像扩展,请考虑这两个函数的行为差异 - wim
@wim - 这绝对是太棒了,但我仍然不明白这个问题除了完全重复之外还有什么不同。我的意思是,你甚至在这里的答案中将其与list.extend进行比较。那个问题的答案同样适用于这个问题,这就是重复的含义。 - TigerhawkT3
显示剩余2条评论
3个回答

3
a += b

a是一个列表时,这个操作与a.extend(b)类似。所以它会迭代对象b,将每个元素添加到a中。

如果你迭代字符串'xy',它会产生两个元素'x''y'

如果你迭代元组'xy',,它会产生一个元素'xy'


3

这条线

a += b,

等同于

a += (b, )

它创建了一个只有一个项目的元组。如果添加了项目'xy',则会将其添加到a中。

如果您添加像'xy'这样的字符串,则该字符串本身被视为字符序列,并且每个序列项(字符)都单独添加到a中。

因此,逗号基本上将b包装成一个元组。


1
逗号创建元组 - 因此,a += b, 的意思与 a += (b,) 相同。
a += ('xy', )

您可以添加一个元素的元组,就像这样:

您添加一个带有一个元素的元组,因此它几乎像

a += ['xy']

所以你有。
a = [] + ['xy']

which gives result

a = ['xy']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接