为什么__len __()为s = []和s = [[]]提供不同的输出结果?

时间:2016-01-12 16:08:55

标签: python list

代码段:

>>>s = []
>>>len(s)
0

但是:

>>>s = [[]]
>>>len(s)
1

我只声明两个列表,但没有分配任何元素,为什么len()会给出不同的输出?

4 个答案:

答案 0 :(得分:5)

分配了一个元素。您的第二个列表包含另一个空列表

>>> l = [[]]
>>> l
[[]]
>>> len(l)
1
>>> l[0]
[]
>>> len(l[0])
0

如果有帮助,请将您所做的分解为两步;创建一个空列表,然后创建另一个只包含该元素的列表:

>>> l1 = []  # empty
>>> len(l1)
0
>>> l2 = [l1]  # one element
>>> l2
[[]]
>>> len(l2)
1

除此之外,我们还有一个对嵌套列表的引用,结果完全相同;包含在另一个列表对象中的空列表。

您可以在外部列表中添加任意数量的空列表;然而,这并没有使外部列表变空:

>>> len([[], [], []])
3

因为外部列表中包含的每个空列表仍然是一个单独的对象。

注意:使用len()内置函数,不要直接调用__len__方法。 Python会为您处理这些细节。

如果您想知道所有包含列表的总长度,可以使用:

sum(len(sub) for sub in outer)

或者您可以使用:

not any(outer)

如果你只是想知道所有包含的元素是否为“空”或者被认为是假的。

演示:

>>> s = [[1, 2], [3, 4]]  # not empty
>>> not any(s)
False
>>> sum(len(sub) for sub in s)
4
>>> s = [[], []]  # all empty
>>> not any(s)
True
>>> sum(len(sub) for sub in s)
0

答案 1 :(得分:4)

在一种情况下,列表中有一个元素:空列表。

s = [[], []]
例如,

有两个元素。

s = [[]]

有一个元素和

s = []

为空

答案 2 :(得分:2)

第二个列表确实包含一个元素,这是一个空列表。

答案 3 :(得分:2)

[]是一个空列表,它没有元素 [[]]是一个只包含一个元素的列表,一个空列表。

>>> for x in []:
...     print(x)
... 
>>> for x in [[]]:
...     print(x)
... 
[]

正如你所看到的,第一个for循环没有打印,因为[]中没有任何内容。第二个for循环打印[],因为[]内有[[]]

如果你从数学中知道集合的概念,这里有一个类比: 设x = {}为空集。然后集{x}包含一个元素(空集)。