代碼片段:爲什麼__len __()給出s = []和s = [[]]的不同輸出結果?
>>>s = []
>>>len(s)
0
但是:
>>>s = [[]]
>>>len(s)
1
我只是聲明瞭兩個名單,但沒有分配任何元素,爲什麼len()
給不同的輸出?
代碼片段:爲什麼__len __()給出s = []和s = [[]]的不同輸出結果?
>>>s = []
>>>len(s)
0
但是:
>>>s = [[]]
>>>len(s)
1
我只是聲明瞭兩個名單,但沒有分配任何元素,爲什麼len()
給不同的輸出?
[]
是一個空列表,它具有零個元素。
[[]]
是一個只有一個元素的列表,一個空列表。
>>> for x in []:
... print(x)
...
>>> for x in [[]]:
... print(x)
...
[]
正如你所看到的,第一個for循環打印什麼,因爲沒有什麼在[]
。第二個循環打印[]
,因爲[[]]
內有[]
。
如果你從數學知道集的概念,下面是一個比喻: 設x = {}爲空集。然後集{x}包含一個元素(空集)。
第二個列表確實包含一個元素,它是一個空列表。
在一種情況下,您的列表中有一個元素:一個空列表。
s = [[], []]
例如有兩個元素。
s = [[]]
有一個元素和
s = []
是空
您並分配的元素。你的第二個列表包含另一個空單:
>>> 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
所以我怎麼能得到一個二維列表s,如果我調用len(s),則輸出爲0? –
@董偉旺:你的目標是什麼?你想解決什麼問題?你想測試列表*中的所有*元素是否都是空的?然後使用'not any(some_list)';如果列表中的所有元素都被認爲是false,那麼將返回True。(https://docs.python.org/2/library/stdtypes.html#truth-value-testing)。因此''[[],0,False,'']'會和'[[]]'一樣有資格。 –
我想聲明一個二維數組s,並且len(s)的輸出是0 –
第二個'''有一個元素參考 – vks
呃,因爲第一個列表是空的,但第二個列表包含的東西? –
另外,沒有理由直接調用'.__ len __()'或任何雙下劃線方法。總是調用內置函數:'len(s)'。 –