3 回答

TA貢獻1808條經驗 獲得超4個贊
這兩個語句具有非常不同的語義。請記住,Python 是動態類型的。
對于 的情況a = []
, 和not a
是len(a) == 0
等價的。一個有效的替代方案可能是檢查not len(a)
. 在某些情況下,您甚至可能想通過執行以下操作來檢查空虛和安逸a == []
。
但a
可以是任何東西。例如,a = None
. 支票not a
沒問題,會退回來的True
。但len(a) == 0
根本不會好起來。相反,你會得到TypeError: object of type 'NoneType' has no len()
. 這是一個完全有效的選項,但是這些if
語句的作用非常不同,您必須選擇您想要的。
(幾乎)__bool__
Python 中的所有東西都有方法,但并非所有東西都有__len__
. 您必須根據情況決定使用哪一種。需要考慮的事情是:
你已經驗證是否
a
是一個序列了嗎?你需要嗎?
您介意您的
if
語句因非序列而崩潰嗎?您是否想將其他虛假對象視為空列表來處理?
請記住,讓代碼看起來漂亮比正確完成工作要重要。

TA貢獻1804條經驗 獲得超3個贊
雖然這個問題很老了,但我想提供一個觀點。
在動態語言中,我的偏好是始終描述變量的預期類型和目標,以便提供更多的目的理解。然后盡可能使用語言知識來簡潔并增加可讀性(在Python中,空列表的布爾結果為假)。因此代碼:
lst_colours = []
if not lst_colours:
print("list is empty")
更好地傳達含義是使用變量進行非常具體的檢查。
lst_colours = []
b_is_list_empty = not lst_colours
if b_is_list_empty:
print("list is empty")
在代碼庫中多次檢查列表是否為空是很常見的事情。因此,在單獨的文件輔助函數庫中實現更好的功能。從而隔離常見的檢查,并減少代碼重復。
lst_colours = []
if b_is_list_empty(lst_colours):
print("list is empty")
def b_is_list_empty (lst):
......
最重要的是,盡可能多地添加含義,有一個商定的公司標準來選擇如何處理簡單的事情,例如變量命名和隱式/顯式代碼選擇。

TA貢獻1815條經驗 獲得超10個贊
試著想一想:
if not a: ...
作為以下形式的簡寫:
if len(a) == 0: ...
我不認為這是 Python 禪宗規則“顯式”優于“隱式”的一個很好的例子。這樣做主要是為了可讀性。并不是說第二個是壞的,另一個是好的。只是第一個更有技巧而已。如果你了解 Python 中列表的布爾性質,我想你會發現第一個在 Python 中更具可讀性和可讀性。
添加回答
舉報