python, dict.items() и dict.iteritems() - чем они отличаются?


#1

Существует ли разница в работе dict.items() и dict.iteritems()? Если да, то какая?, а то я так и не смог её найти.

Из документации Python:

dict.items(): верните копию из списка словарей (пары ключ, значение).

dict.iteritems(): верните итератор по парам словарей (ключ, значение).

Ниже приведённый код приводит к одному и тому же результату неважно что применять к словарю:

d = { 1 : 'one' , 2 : 'two' , 3 : 'three' }

print 'd.items():'  

for index,item in d.items():
   if d[index] is item : 
           print 'одинаковые 
   else: 
           print 'разные'

print 'd.iteritems():'   

for index,item in d.iteritems():
   if d[index] is item : 
           print 'одинаковые 
   else: 
           print 'разные'

Вывод:

d.items():
    одинаковые 
    одинаковые 
    одинаковые 
d.iteritems():
    одинаковые 
    одинаковые 
    одинаковые

#2

dict.items() - создаст список из кортежей. если брать приведённый Вами пример, то для словаря { 1 : 'one' , 2 : 'two' , 3 : 'three' } создаётся [ (1, 'one'), (2, 'two'), (3, 'three')] по которому произойдёт проход. Соответственно dict.items создаёт список кортежей на что отдельно выделяется как время так и память.

dict.iteritems() - не создаёт отдельный список, а создаёт итератор позволяющий пройтись по элементах Вашего словаря, но при этом если словарь во время прохождения изменится (будут добавлены/удалены его элементы), то проход по новым элементам будет упущен, а при обращении к удалённому элементу возникнет ошибка.

Также есть третий вариант прохода по словарю - это использовать dict.viewitems() - он также как и dict.iteritems() создаёт итератор, но их отличие состоит в том что он сможет пройтись и по добавленным (во время прохождения) элементам словарь. В Python3 dict.items() работает как dict.viewitems() из Python2.7


#3

Вдруг когда-нибудь на 3.х перейдете :slight_smile:

for index,item in iter(d.items()) :