2014-01-05 14 views
1

我用Python語言編寫這樣的功能:打印的順序時使用的物品()在python

def test(**argv): 
    for k,v in argv.items(): 
     print k,v 

和使用這樣的功能:

test(x = 1, y=2, z=3) 

打印輸出是這樣的:

y 2 
x 1 
z 3 

我想知道爲什麼打印輸出的結果是不是?:

x 1 
y 2 
z 3 

這裏有什麼幫助嗎?

+0

可能的重複[在Python中,什麼決定了通過kwargs迭代時的順序?](http://stackoverflow.com/questions/8977594/in-python-what-determines-the-order-while-iterating-through -kwargs) – jonrsharpe

+0

@ jonrsharpe哎呀,抱歉,我現在該怎麼辦? – CSnerd

+0

閱讀鏈接的問題,如果您同意在那裏回答,請刪除您的問題,否則請等待社區投票決定發生什麼。見http://stackoverflow.com/help/duplicates – jonrsharpe

回答

5

如果您打印類型argv,您會意識到它是一本字典。

詞典在Python中是無序的。這就是爲什麼你得到這個輸出。

測試

def test(**argv): 
    print type(argv) 

test() 

>>> <type 'dict'> 
2

字典是一個哈希表,該鍵的順序不被保證。您需要保留訂單 - 有collections.OrderedDict,它保留了元素添加的順序。

+0

您可以使用** ** kwargs使用OrderedDict嗎?我認爲你需要一個事後'排序' – jonrsharpe

+0

@jonrsharpe正確。您可以對鍵值對進行排序,但即使如此,您也無法檢索關鍵字參數在呼叫站點寫出的順序。 – delnan

+0

@jonrsharpe,是的,如果有序字典作爲關鍵字參數傳遞,則順序不會被保留。 – volcano