2017-06-19 108 views
3

我在閱讀@Martijn Pieters對Converting dict to OrderedDict的回覆。他的回答的主要觀點是,傳遞OrderedDict()的正則字典將不會保留所需的順序,因爲您傳遞的字典已經「失去」任何秩序的外表。他的解決方案是傳遞構成字典鍵/值對的元組。將OrictDict傳遞給OrderedDict會出現什麼問題?

但是,我也注意到了docs如下:

改變在3.6版本:接受PEP 468,順序 保留傳遞到OrderedDict

關鍵字參數這是否使Martijn指出的問題無效(您現在可以通過OrderedDict傳遞一個詞典)還是我誤解了?

from collections import OrderedDict 

ship = {'NAME': 'Albatross', 
     'HP':50, 
     'BLASTERS':13, 
     'THRUSTERS':18, 
     'PRICE':250} 
print(ship) # order lost as expected 
{'BLASTERS': 13, 'HP': 50, 'NAME': 'Albatross', 'PRICE': 250, 'THRUSTERS': 18} 
print(OrderedDict(ship)) # order preserved even though a dict is passed? 
OrderedDict([('NAME', 'Albatross'), 
      ('HP', 50), 
      ('BLASTERS', 13), 
      ('THRUSTERS', 18), 
      ('PRICE', 250)]) 

我得到這個相同的(正確的)命令,如果我運行一個for key in ...環比OrderedDict爲好,似乎在暗示這是確定要通過字典本身。

編輯:這也促成了一下我的困惑:Are dictionaries ordered in Python 3.6+?

+0

爲**關鍵字參數保留的訂單**傳遞給OrderedDict。不知道你從哪裏得到你的想法。 –

回答

7

訂單會保留傳遞到OrderedDict關鍵字參數

這意味着,以下是保證保留訂單:

od = OrderedDict(a=20, b=30, c=40, d=50) 

也就是傳遞關鍵字參數的順序。這在Python 3.6中是語言特性;所有其他實現都需要遵循。

這是如何工作的,爲了執行此調用,將創建一個包含關鍵字參數的字典。作爲dict,在3.6之前,它丟失了有關這些提供順序的信息。

隨着PEP 468被市場接受的3.6,這是保證現在使用的是持有該信息(在CPython的,在「命令映射」恰好是一個dict有序映射但是,這是一個實現細節 - - 更新:從Python 3.7開始的語言特性。)。


使用OrderedDict(ship),你目前做的,還保留在3.6訂單,因爲dict有執行現在不是由於PEP 468這是你不應該依賴於它被認爲是一個實現細節CPython實現;在未來,這可能會改變(看起來它會),但在那之前,你不應該依賴它。

從Python 3.7開始,現在保證前一個保存實現的順序,因爲dict插入順序現在是語言功能。

+0

好的,謝謝,我不知道我爲什麼把這個詞典與kwargs聯繫起來。但是你提到「'dict'現在有這個功能。」你能詳細說明嗎?傳遞一系列元組的意義在於,如果通過傳遞字典本身來保存預期的順序,那麼它會在我所鏈接的答案中記錄下來? –

+2

@BradSolomon,因爲具有該功能的dict是*實現細節*,也就是說,您不應該依賴它。如果你這樣做的話,你的程序在其他Python實現或未來版本的CPython(大多數人使用的Python實現)中行爲不正確。 'dict'是一個實現細節的事實可能會在將來發生變化(使它成爲語言的一個有保證的特性),在這一點上你*可以*依賴它。 –

+0

我想這是[+](https://mail.python.org/pipermail/python-dev/2017-December/151283.html)在3.7+? @Jim –

相關問題