2017-05-24 61 views
2

在3.6版本的Python中,關鍵字參數的插入順序現在是guaranteed to be preserved。這可以通過改變dict對象的基礎表示來實現。現在是否應該保證kwargs.copy()的插入順序? (Python 3.6後)

但是,已經聲明 - somewhat strenuously - 保留dict對象的命令一般不應該依賴於此。該文檔說明情況是這樣的:

這個新實現的保序方面被認爲是 實現細節並且不應該(在將來這可能 變化的依據,但它需要有在將 語言規範更改爲強制所有當前的 和未來的Python實現的順序保留語義之前,這一新的字典 以少數版本的語言實現;這也有助於保留 向後兼容舊版本的語言,其中 隨機迭代順序仍然有效,例如Python 3.5)。

PEP 468沒有提及複製關鍵字參數的任何內容。但有些時候,不妨一迭代的kwargs參數的副本(例如同時在for循環變異kwargs):

def i_will_never_fail(**kwargs): 
    for thing1,thing2 in zip(kwargs.copy(), kwargs): 
     assert thing1==thing2 

我的問題是:應該從kwargs.copy()導致的對象的順序來考慮還有保證?或者這也應該被視爲一個實現細節?是OrderedDictonly mostly dead

+1

相關:https://stackoverflow.com/questions/39980323/dictionaries-are-ordered-in-python-3-6 –

回答

1

答案將取決於實施。

假設非常流行的CPython,答案是肯定的。正如你可以從PyDict_Copy功能在dictobject.c代碼(行2615),請參閱隨該值引用以來,函數啓動複製與片

split_copy->ma_keys = mp->ma_keys; 

此之後,mp已分配dicitionary對象(或者更準確地說,將原始dict顯式轉換爲PyDictObject)。

由於密鑰保留了它們的順序,並且考慮到當前的存儲形式(如Jim's explanation here所示),因此產生的字典應該以相同的方式排序。

再次,目前認爲是實現細節,你應該做任何你的代碼依賴於它。

相關問題