2011-12-02 10 views

Odpowiedz

6

Tak, zawsze jest to prawda. Gwarantowane przez Python iff nie ma żadnych interwencji modyfikacji do ditionary.

Odpowiednia specyfikacja: http://docs.python.org/library/stdtypes.html#dict.items

Jest lepiej ogólnie, zarówno dlatego, że chroni przed dict będzie zsynchronizowany i korzysta znikomy dodatkowej pamięci:

dict((k,v) for k,v in d.iteritems())

+2

Rozpakowanie jest niepotrzebne, chociaż 'dict (d.iteritems())' działa równie dobrze. Jeśli o to chodzi, większość dyktuje (w tym 'dyktowanie') mapowania w specjalnym przypadku (w ogóle na iterabelach) i tak czy inaczej, chociaż nie jestem pewien, czy to uniwersalne. – delnan

+0

@delnan przegłosował twój komentarz, ale myślę, że trzymanie się tego przykładu ma sens. – Triptych

+0

Nigdy nie chciałbyś zrobić 'dict ((k, v) dla k, v w d.iteritems())' lub 'dict (d.iteritems())' ponieważ 'd.copy()' jest znacznie lepszy . – Gabe

2

Jeśli pytasz, czy klucze i wartości są zwracane w tej samej kolejności, odpowiedź brzmi Tak. documentation mówi:

Jeśli items(), keys(), values(), iteritems(), iterkeys() i itervalues() nazywane są bez interweniujących modyfikacji do słownika, listy będą bezpośrednio odpowiadać.

Jeśli pytasz czy dict(zip(d.keys(), d.values())) == d zawsze oceniać na True w każdych okolicznościach, odpowiedź brzmi: Nie. Można mieć wiele wątków, z jednym zmieniającym d, podczas gdy druga jest wykonywany d.keys(), d.values() lub dict(...). Spowoduje to utworzenie interwencji modyfikujących, unieważniając wyżej wymienione warunki.

2

Tak, jest zagwarantowane zachowanie :-)

Klucze i wartości wymienionych w tej samej kolejności, zwrócony przez d.items: http://docs.python.org/library/stdtypes.html#dict.items

uwagi, w środowisku wielowątkowych to Najlepiej jest wyodrębnić wszystkie od razu, zamiast ryzykować mutację między kolejnymi wywołaniami d.keys() i d.values().