我刚刚看到有人在下面写了这篇文章,并感到困惑为什么可以使用sum()
从另一个列表中删除括号:
pwd = [['x'], ['y'], ['z']]
a = sum(pwd, [])
print(a) // ['x', 'y', 'z']
通过查找sum()
定义...
sum(
iterable
,/,start=0
)'
iterable
可以是任何东西,列表,元组或字典,但最重要的是它应该是数字。
start
被添加到可迭代对象中的数字总和中。 如果语法中未给出start
,则假定为 0。
空列表作为start
参数sum()
如何从另一个列表中删除列表?这让我很困惑...谁能揭开这个谜团的神秘面纱?
想想总和的作用。这:
x = sum([1,2,3,4],0)
与
x = 0 + 1 + 2 + 3 + 4
同样地
x = sum([['x'],['y'],['z']], [])
与
x = [] + ['x'] + ['y'] + ['z']
这导致了x = ['x','y','z']
. 这是list
类型覆盖+
运算符这一事实的副作用。
Python 不知道加法是什么意思。它依赖于对象方法来完成工作。+
实际上是对对象的__add__
方法的调用。 整数添加,但列表扩展 - 至少在添加另一个列表时。
sum
将迭代值添加到start
对象。当您start
成为列表时,它会使用列表添加规则求和。在您的情况下,您从一个空列表开始,然后添加每个迭代值(也是一个列表)- 扩展列表。它与
>>> a = []
>>> pwd = [['x'], ['y'], ['z']]
>>> for val in pwd:
... print(val)
... a = a + val
...
['x']
['y']
['z']
>>> a
['x', 'y', 'z']
这是 python 动态特性的一部分,在各种包中以多种方式被利用。 例如,Numpy和Pandas在整个矩阵中广播操作。 Pathlib 覆盖除法以连接路径。
有人可能会争辩说,你实现的任何类都应该优先覆盖现有的实现python运算符的"魔术方法",而不是他们自己的方法。当队列可以实现+=
时,为什么会有put
?好吧,这也是一个糟糕的选择的原因!这就是设计工作。
我们从空列表开始。
处理完第一个元素后,我们有[] + ['x'] == ['x']
.
处理完第二个元素后,我们有['x'] + ['y'] == ['x', 'y']
.
处理完第三个元素后,我们得到了['x', 'y'] + ['z'] == ['x', 'y', 'z']
,如观察。
添加列表只是将它们连接起来:
sum(pwd,[]) = [] + ['x'] + ['y'] + ['z']
= ['x', 'y', 'z']
我们需要空列表,因为sum(x)
与sum(x,0)
相同
和sum(pwd,0)
→0 + ['x'] + ['y'] + ['z']
这给出了一个错误,因为int
无法添加到list
中。