2009-11-06 38 views
4

在一些Python代碼我讀過我一直注意到這個代碼:返回使用dict構造的散列而不是僅使用花括號語法是否有什麼好處?

return dict(somekey=somevalue) 

確實有過任何的好處:我傾向於說沒有

return {somekey:somevalue} 

,因爲這兩個對象將屬於相同的dict類型,但我可能是錯的。

+1

什麼是你講這個「散列」?在Python中,我們稱他們爲'詞典'。 – PaulMcG

+1

來吧保羅,關掉'strict'標誌:) – Geo

+1

'哈希,校驗,嚴格=字典,哈希,「怎麼都行」'' – u0b34a0f6ae

回答

15
 
>>> 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 

沒有功能差異,但後者更有效。

5

它們在語義上是相同的。

dict(param=value, ...)表示法將您的鍵限制爲有效Python標識符的字符串。

dict(sequence-of-2-tuples)實際上與{}相同。

{}表示法對鍵沒有限制。除了它們是可散列的對象。

存在性能差異。

+0

有dict'我看到的這個網站的功能,但我不自己發現它很直觀;你可以在一個語句中連接兩個字符:'D = dict(d1,** d2)'。它很整潔,但有點破,因爲'd2'只能有字符串鍵。 – u0b34a0f6ae

+0

我相信'd3 = dict(d1); d3.update(d2)'是合併兩個詞典的更常見的,Pythonic和更安全的方法。 – ephemient

1

花括號是一種合成語言,所以唯一的好處是可以更清晰地表達字典的結構。

1

dict(somekey=somevalue){'somekey': somevalue}完全相同。 (然後,你的兩個例子並不完全相同 - 在第一種情況下,關鍵字是字符串'somekey'作爲關鍵字,第二個例子中的關鍵字是關鍵字。)除非您避免使用字典文字,否則通常更好一些輸入所有的引號。

2

{somekey:somevalue}只能用作文字,它不允許任何括號內循環。

dict需要**kwargs,這意味着你可以例如做dict(**locals())。當您不想輸入引號和大括號時,dict(somekey=somevalue)只是一個很好的捷徑。

還有第三個字典構造函數,dict([(key,val),(key2,val2)])。它的功能最強大,經常與zip

+1

順便說一句,Python 3概括了列表解析以允許字典(和集合)的理解:即{k:v for k,v in stuff if expr} –

2

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被用作方法參數,並且沒有人注意到它,並且它沒有壞處,因爲該方法非常短。對內置函數使用語法突出顯示來解決這個問題,這是我的建議。

+0

+ 1用於提升Python的動態性作爲理由。在另一方面,雖然它是合法的,你會是相當瘋狂的重新定義'dict' - 它會打破Psyco的,更何況混淆別人與您的代碼工作。 – ephemient

相關問題