s = "text"
parts = [] # <<< why not just parts = 0
print id(parts) # 3074379948
parts = s.split()
print id(parts) # 3074380332
我在幾個程序中看到了這一點,但我無法理解爲什麼。因爲parts
引用了不同的對象。所以這只是爲了可讀性?在使用之前定義和分配空列表給變量
s = "text"
parts = [] # <<< why not just parts = 0
print id(parts) # 3074379948
parts = s.split()
print id(parts) # 3074380332
我在幾個程序中看到了這一點,但我無法理解爲什麼。因爲parts
引用了不同的對象。所以這只是爲了可讀性?在使用之前定義和分配空列表給變量
如果你在看代碼的第二部分,可以看到正在發生的分配是
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
的代碼設置默認值,其中parts
值有望成爲一個列表對象,總是。
也許parts = s.split()
行並不總是到達,但parts
變量總是被使用並且預期是一個列表。如果存在if
語句或try..except
或try..finally
語句,或者甚至在語句將繞過循環主體的一部分的循環中,則可能會發生這種情況。
然後設置parts = 0
是沒有意義的,因爲整數不是同一類型的對象。如果始終執行s.split()
,則可以完全省略parts = []
行,那麼它只是冗餘的。
也許代碼在不同的代碼路徑中使用,或者可能需要初始化變量的代碼的較早版本;或者也許沒有很好的理由。
將變量初始化爲錯誤類型的值(整數零贊成空列表)當然沒有任何意義。
我會說'parts = []'比'parts = 0'好。它顯示'parts'是一個列表,即使它被重新定義爲另一個列表。首先使用'parts = 0'只會增加額外的混淆,因爲類型會改變。 – Phylogenesis
如果s.split()引發異常,則可能很重要 - 在'finally'例程中'parts'總是被定義的並且總是一個'正確'類型。在你的代碼片段中 - 它沒有任何意義。 –