странное поведение со списком словарей в Python - PullRequest
2 голосов
/ 22 декабря 2011

Вот простой код, который выполняет операции со списками:

>>> a = [0] * 5
>>> a
[0, 0, 0, 0, 0]
>>> a[0] = 5
>>> a
[5, 0, 0, 0, 0]
>>> 

На данный момент, ничего ненормального.

Теперь я пытаюсь сделать то же самое со списком словарей вместосписок целых чисел:

>>> a = [{}] * 5
>>> a
[{}, {}, {}, {}, {}]
>>> a[0]['b'] = 4
>>> a
[{'b': 4}, {'b': 4}, {'b': 4}, {'b': 4}, {'b': 4}]
>>> 

Я не понимаю, почему все элементы моего списка изменены ...

Может кто-нибудь сказать мне, почему?А также предоставить обходной путь?

Ответы [ 2 ]

9 голосов
/ 22 декабря 2011

Это не странно.


Обход проблемы:

a = [{} for i in xrange(5)]

[…] * 5 создает один и список из пяти указателей на этот .

0 является неизменным целым числом.Вы не можете изменить его, вы можете просто заменить его другим целым числом (например, a[0] = 5).Тогда это другое целое число.

{} - изменяемый словарь.Вы модифицируете его: a[0]['b'] = 4.Это всегда один и тот же словарь.

0 голосов
/ 05 ноября 2015

Попробуйте это,

a = map([].append, {} for i in xrange(3))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...