私はPython 2.7.5でいくつかのスクリプトを作成していますが、collections.OrderedDict に関連して説明できない奇妙な動作を見つけました。これらの例について、saps_to_add = set([1, 2, 3])
.
次に、私がするとき:
>>> mine = [collections.OrderedDict({u'GNCompIdentifie': id, u'DesiredAdminState': u'IN_SERVICE'}) for id in saps_to_add]
>>> mine
[OrderedDict([(u'GNCompIdentifie', 1), (u'DesiredAdminState', u'IN_SERVICE')]),
OrderedDict([(u'GNCompIdentifie', 2), (u'DesiredAdminState', u'IN_SERVICE')]),
OrderedDict([(u'GNCompIdentifie', 3), (u'DesiredAdminState', u'IN_SERVICE')])]
通常の予想される出力が得られます。しかし、もう1 文字追加して に変更u'GNCompIdentifie
するu'GNCompIdentifier'
と、次の逆の出力が得られます。
>>> theirs = [collections.OrderedDict({u'GNCompIdentifier': id, u'DesiredAdminState': u'IN_SERVICE'}) for id in saps_to_add]
>>> theirs
[OrderedDict([(u'DesiredAdminState', u'IN_SERVICE'), (u'GNCompIdentifier', 1)]),
OrderedDict([(u'DesiredAdminState', u'IN_SERVICE'), (u'GNCompIdentifier', 2)]),
OrderedDict([(u'DesiredAdminState', u'IN_SERVICE'), (u'GNCompIdentifier', 3)])]
長さをu'GNCompIdentifier'
いくつかの異なる値に変更して、出力に何が起こるかを確認してみました。私が知る限り、サイズu'GNCompIdentifie'
は正しい挿入順序で表示されますが、サイズ以上u'GNCompIdentifier'
は文字列の長さのパリティに依存します。奇数の長さは正しい順序で挿入されますが、偶数の長さは逆の順序で挿入されます。
さらに:
>>> for i in range(25):
... del mine
... mine = [collections.OrderedDict({u'GNCompIdentifier!!!!!': id, u'DesiredAdminState': u'IN_SERVICE'}) for id in saps_to_add]
... mine
u'GNCompIdentifier!!!!!'
は一貫して正しい出力を生成します (奇数の長さ 21 であるため、正しい順序で挿入されます)。
何がこの動作につながる可能性があるのか 、私は完全に困惑しています。助けやアドバイスをいただければ幸いです。前もって感謝します。