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

Don*_*ang -2 python list

代码段:

>>>s = []
>>>len(s)
0
Run Code Online (Sandbox Code Playgroud)

然而:

>>>s = [[]]
>>>len(s)
1
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 5

确实分配了一个元素.您的第二个列表包含另一个空列表:

>>> l = [[]]
>>> l
[[]]
>>> len(l)
1
>>> l[0]
[]
>>> len(l[0])
0
Run Code Online (Sandbox Code Playgroud)

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

>>> l1 = []  # empty
>>> len(l1)
0
>>> l2 = [l1]  # one element
>>> l2
[[]]
>>> len(l2)
1
Run Code Online (Sandbox Code Playgroud)

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

您可以在外部列表中添加任意数量的空列表; 然而,这不会使外部列表为空:

>>> len([[], [], []])
3
Run Code Online (Sandbox Code Playgroud)

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

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

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

sum(len(sub) for sub in outer)
Run Code Online (Sandbox Code Playgroud)

或者您可以使用:

not any(outer)
Run Code Online (Sandbox Code Playgroud)

如果你只是想知道所有包含的元素是否为"空"或被认为是假的.

演示:

>>> 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
Run Code Online (Sandbox Code Playgroud)