2016-01-12 245 views
-2

代碼片段:爲什麼__len __()給出s = []和s = [[]]的不同輸出結果?

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

但是:

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

我只是聲明瞭兩個名單,但沒有分配任何元素,爲什麼len()給不同的輸出?

+0

第二個'''有一個元素參考 – vks

+3

呃,因爲第一個列表是空的,但第二個列表包含的東西? –

+2

另外,沒有理由直接調用'.__ len __()'或任何雙下劃線方法。總是調用內置函數:'len(s)'。 –

回答

2

[]是一個空列表,它具有零個元素。
[[]]是一個只有一個元素的列表,一個空列表。

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

正如你所看到的,第一個for循環打印什麼,因爲沒有什麼在[]。第二個循環打印[],因爲[[]]內有[]

如果你從數學知道集的概念,下面是一個比喻: 設x = {}爲空集。然後集{x}包含一個元素(空集)。

2

第二個列表確實包含一個元素,它是一個空列表。

4

在一種情況下,您的列表中有一個元素:一個空列表。

s = [[], []] 

例如有兩個元素。

s = [[]] 

有一個元素和

s = [] 

是空

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 
+0

所以我怎麼能得到一個二維列表s,如果我調用len(s),則輸出爲0? –

+0

@董偉旺:你的目標是什麼?你想解決什麼問題?你想測試列表*中的所有*元素是否都是空的?然後使用'not any(some_list)';如果列表中的所有元素都被認爲是false,那麼將返回True。(https://docs.python.org/2/library/stdtypes.html#truth-value-testing)。因此''[[],0,False,'']'會和'[[]]'一樣有資格。 –

+0

我想聲明一個二維數組s,並且len(s)的輸出是0 –

相關問題