2024-04-23 13:46:25 发布
网友
我注意到,在python中,您可以使用+=将其附加到列表中,请执行以下操作:
+=
s = ['a', 'b', 'c'] s += 'd' # s = ['a', 'b', 'c', 'd']
这与执行s.append('d')相同。但s.remove('a')没有等价物:
s.append('d')
那么当你使用+=时会发生什么呢?
在list上的+=与做s.append是不同的。这和做s.extend是一样的。在这种情况下,它看起来只是一样的,因为字符串是一个字符序列,所以一个字符串本身就是一个序列。一般来说,这是非常不同的。尝试用数字或3个字符的字符串。在
list
s.append
s.extend
总之,“当您使用+=时发生了什么”是这样的:
首先,语句a += b查找方法a.__iadd__。如果它存在(就像它通常在可以就地改变的对象上一样,比如list),它将被转换成以下代码:
a += b
a.__iadd__
a = a.__iadd__(b)
否则(与不可变对象一样,比如int),它被转换成(松散地说)为:
int
list.__iadd__存在。当然,在CPython中,它是用C实现的,但是等效的Python代码非常简单:
list.__iadd__
def __iadd__(self, other): self.extend(other) return self
该extend方法等效于:
extend
def self.extend(self, iterable): for element in iterable: self.append(element)
因此,您的s += 'd'有效地做到了:
s += 'd'
for char in 'd': # this loops once, with `char` being `'d'` s.append(char) s = s
显然,在幕后很多东西都是优化的;extend不必动态地查找append方法或在循环中调用它(可能多次扩展列表的存储),它只需具有与它这样做一样的可见效果。在
append
有关如何工作的更多信息,请参阅文档的以下部分:
list.extend
在
list
上的+=
与做s.append
是不同的。这和做s.extend
是一样的。在这种情况下,它看起来只是一样的,因为字符串是一个字符序列,所以一个字符串本身就是一个序列。一般来说,这是非常不同的。尝试用数字或3个字符的字符串。在总之,“当您使用
+=
时发生了什么”是这样的:首先,语句
a += b
查找方法a.__iadd__
。如果它存在(就像它通常在可以就地改变的对象上一样,比如list
),它将被转换成以下代码:否则(与不可变对象一样,比如
^{pr2}$int
),它被转换成(松散地说)为:list.__iadd__
存在。当然,在CPython中,它是用C实现的,但是等效的Python代码非常简单:该
extend
方法等效于:因此,您的
s += 'd'
有效地做到了:显然,在幕后很多东西都是优化的;
extend
不必动态地查找append
方法或在循环中调用它(可能多次扩展列表的存储),它只需具有与它这样做一样的可见效果。在有关如何工作的更多信息,请参阅文档的以下部分:
a += b
是如何解释的。在list.__iadd__
、list.extend
和{+=
是如何被解析的(注意,它不是Python中的运算符,不像其他许多语言,而是一种特殊的东西,只能出现在语句中,而不是表达式中)。在相关问题 更多 >
编程相关推荐