Что ж, если вам интересно узнать личность, вы всегда можете проверить, используя оператор is
:
>>> help('is')
Причина, по которой ваша попытка не сработала, заключается в том, что вы создавали словарь вне циклапоэтому, конечно, у вас будут проблемы:
>>> mydict = {}
>>> for x in xrange(3):
... d = mydict
... print d is mydict
...
...
True
True
True
Независимо от того, сколько раз вы добавляете вещи в d
или mydict
, mydict
всегда будет одним и тем же объектом.
Другие отметили, что вы должны использовать copy, но им не удалось решить вашу основную проблему - вы, похоже, не понимаете ссылочные типы.
В Python все является объектом.Существует два основных типа - изменяемые и неизменяемые.Неизменяемыми объектами являются такие вещи, как строки, числа и кортежи.Вы не можете изменять эти объекты в памяти:
>>> x = 3
>>> y = x
>>> x is y
True
Теперь x
и y
ссылаются на один и тот же объект (не только имеют одно и то же значение).
>>> x += 4
Поскольку 3 является целым числом и является неизменным, эта операция не изменяет значение, которое хранится в x
, фактически она добавляет 3 и 4 и обнаруживает, что это приводит к значению 7, поэтому теперь x
«указывает» на 7.
>>> y
3
>>> x
7
>>> x is y
False
>>> y = x
>>> x is y
True
С изменяемыми объектами вы можете изменить их на месте:
>>> mylist = [1,2,3]
>>> mylist[0] = 3
>>> mylist
[3, 2, 3]
Вам будет намного легче, если вы перестанете думать о переменных вPython хранит значения в переменных и вместо этого думает о них как о тегах имен - вы знаете, те, которые говорят «Здравствуйте, меня зовут»?
Итак, по сути, то, что происходит в вашем коде, это то, что объект возвращаетсяваш цикл один и тот же каждый раз.
Вот пример:
>>> def spam_ref():
... thing = []
... count = 0
... while count < 10:
... count += 1
... thing.append(count)
... yield thing
...
>>> for a in spam_ref():
... print a
...
[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6, 7]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> spam = []
>>> for a in spam_ref():
... spam.append(a)
...
Итак, если вы посмотрите на вывод цикла, вы бы подумали, что spam
теперь содержит
[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6, 7]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Ноэто не так:
>>> for a in spam:
... print a
...
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Поскольку список изменчив, поэтому функция генератора смогла изменить его на месте.В вашем случае у вас есть возвращаемый словарь, поэтому, как уже упоминали другие, вам нужно будет использовать какой-то метод копирования словаря.
Для дальнейшего чтения, ознакомьтесь с Python Objects и вызов по объекту через effbot.