在一些Python代碼我讀過我一直注意到這個代碼:返回使用dict構造的散列而不是僅使用花括號語法是否有什麼好處?
return dict(somekey=somevalue)
確實有過任何的好處:我傾向於說沒有
return {somekey:somevalue}
,因爲這兩個對象將屬於相同的dict
類型,但我可能是錯的。
在一些Python代碼我讀過我一直注意到這個代碼:返回使用dict構造的散列而不是僅使用花括號語法是否有什麼好處?
return dict(somekey=somevalue)
確實有過任何的好處:我傾向於說沒有
return {somekey:somevalue}
,因爲這兩個對象將屬於相同的dict
類型,但我可能是錯的。
>>> def foo(): return dict(a=1) ... >>> def bar(): return {'a':1} ... >>> import dis >>> dis.dis(foo) 1 0 LOAD_GLOBAL 0 (dict) 3 LOAD_CONST 1 ('a') 6 LOAD_CONST 2 (1) 9 CALL_FUNCTION 256 12 RETURN_VALUE >>> dis.dis(bar) 1 0 BUILD_MAP 1 3 LOAD_CONST 1 (1) 6 LOAD_CONST 2 ('a') 9 STORE_MAP 10 RETURN_VALUE >>> import timeit >>> timeit.Timer(foo).timeit() 0.76093816757202148 >>> timeit.Timer(bar).timeit() 0.31897807121276855
沒有功能差異,但後者更有效。
它們在語義上是相同的。
dict(param=value, ...)
表示法將您的鍵限制爲有效Python標識符的字符串。
dict(sequence-of-2-tuples)
實際上與{}
相同。
{}
表示法對鍵沒有限制。除了它們是可散列的對象。
存在性能差異。
有dict'我看到的這個網站的功能,但我不自己發現它很直觀;你可以在一個語句中連接兩個字符:'D = dict(d1,** d2)'。它很整潔,但有點破,因爲'd2'只能有字符串鍵。 – u0b34a0f6ae
我相信'd3 = dict(d1); d3.update(d2)'是合併兩個詞典的更常見的,Pythonic和更安全的方法。 – ephemient
花括號是一種合成語言,所以唯一的好處是可以更清晰地表達字典的結構。
dict(somekey=somevalue)
與{'somekey': somevalue}
完全相同。 (然後,你的兩個例子並不完全相同 - 在第一種情況下,關鍵字是字符串'somekey'
作爲關鍵字,第二個例子中的關鍵字是關鍵字。)除非您避免使用字典文字,否則通常更好一些輸入所有的引號。
{somekey:somevalue}
只能用作文字,它不允許任何括號內循環。
dict
需要**kwargs
,這意味着你可以例如做dict(**locals())
。當您不想輸入引號和大括號時,dict(somekey=somevalue)
只是一個很好的捷徑。
還有第三個字典構造函數,dict([(key,val),(key2,val2)])
。它的功能最強大,經常與zip
順便說一句,Python 3概括了列表解析以允許字典(和集合)的理解:即{k:v for k,v in stuff if expr} –
Python是動態的 - 所以你可以重新定義'dict'在任何範圍內的含義,而Python的語法是絕對不可編程的。因此,Python解析器在看到大括號時可以得出結論,它必須構建一個字典。一個dict(..)
表達式必須像任何其他函數調用一樣總是被評估;查找名稱,構建參數元組等。
實際上,使用容器文字(如{}
)花括號最接近您可以在Python中使用靜態類型聲明。
我認爲這已經影響了Python 3決定引入設置文字如s = {1,2,3}
。
這確實發生了,程序員重新分配python內建!我認爲這主要是由錯誤的,而且大多僅限於局部變量(和Python的命名空間確保它不能做太大的傷害!)Here is a Google Code Search for code reassigning dict
。我認爲最奇怪的例子是dict = dict()
;到那時,你應該明白你在做什麼!
,它是可以做到的,這並不意味着你應該這樣做。是的,比如說認爲字典的確可以稱爲hash
在Python和換出其他內建稱爲哈希是不是你應該做的:
hash, checksum = dict, hash
:-)
,做這個的代碼示例可以在Python標準庫中找到。沒錯,這裏是來自shelve.py的第92行:
def __init__(self, dict, protocol=None, writeback=False):
self.dict = dict
if protocol is None:
protocol = 0
self._protocol = protocol
self.writeback = writeback
self.cache = {}
這是一個非常典型的例子; dict被用作方法參數,並且沒有人注意到它,並且它沒有壞處,因爲該方法非常短。對內置函數使用語法突出顯示來解決這個問題,這是我的建議。
+ 1用於提升Python的動態性作爲理由。在另一方面,雖然它是合法的,你會是相當瘋狂的重新定義'dict' - 它會打破Psyco的,更何況混淆別人與您的代碼工作。 – ephemient
什麼是你講這個「散列」?在Python中,我們稱他們爲'詞典'。 – PaulMcG
來吧保羅,關掉'strict'標誌:) – Geo
'哈希,校驗,嚴格=字典,哈希,「怎麼都行」'' – u0b34a0f6ae