2015-05-02 42 views
2
s = "text" 
parts = [] # <<< why not just parts = 0 
print id(parts) # 3074379948 

parts = s.split() 
print id(parts) # 3074380332 

我在幾個程序中看到了這一點,但我無法理解爲什麼。因爲parts引用了不同的對象。所以這只是爲了可讀性?在使用之前定義和分配空列表給變量

+0

我會說'parts = []'比'parts = 0'好。它顯示'parts'是一個列表,即使它被重新定義爲另一個列表。首先使用'parts = 0'只會增加額外的混淆,因爲類型會改變。 – Phylogenesis

+1

如果s.split()引發異常,則可能很重要 - 在'finally'例程中'parts'總是被定義的並且總是一個'正確'類型。在你的代碼片段中 - 它沒有任何意義。 –

回答

3

如果你在看代碼的第二部分,可以看到正在發生的分配是

parts = s.split() 
print id(parts) # 3074380332 

在上面,parts有望成爲一個list,因爲它是.split輸出。因此,爲了保持程序的一致性,將其實例化爲具有相同類型的值,如parts = [],這是合乎邏輯的。


想象一個場景,其中第二部分失敗(例如代碼),你仍然想要做的事與parts。如果使用任何其他值對此進行實例化,則代碼在邏輯上會變得不一致,並且可能會引發錯誤。如果下面沒有parts = 0,它根本就已經失敗了,因爲隨後的部分不會是一個迭代,依此類推:

parts = [] # works 
# parts = 0 # doesn't work 
try: 
    s = 0 
    parts = s.split() 
except: 
    pass 
for part in parts: 
    print part 
2

的代碼設置默認值,其中parts值有望成爲一個列表對象,總是。

也許parts = s.split()行並不總是到達,但parts變量總是被使用並且預期是一個列表。如果存在if語句或try..excepttry..finally語句,或者甚至在語句將繞過循環主體的一部分的循環中,則可能會發生這種情況。

然後設置parts = 0是沒有意義的,因爲整數不是同一類型的對象。如果始終執行s.split(),則可以完全省略parts = []行,那麼它只是冗餘的。

0

也許代碼在不同的代碼路徑中使用,或者可能需要初始化變量的代碼的較早版本;或者也許沒有很好的理由。

將變量初始化爲錯誤類型的值(整數零贊成空列表)當然沒有任何意義。