sum() 删除双精度列表中的括号



我刚刚看到有人在下面写了这篇文章,并感到困惑为什么可以使用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中。

最新更新