q = range(5)
# в словарике будут на один ключ списки строк
d = dict(zip(q, [[]]*len(q)))
d
# {0: [], 1: [], 2: [], 3: [], 4: []}
# а теперь внимание
d0 = d[0]
d0.append('a')
d
# {0: ['a'], 1: ['a'], 2: ['a'], 3: ['a'], 4: ['a']}
q = range(5)
# в словарике будут на один ключ списки строк
d = dict(zip(q, [[]]*len(q)))
d
# {0: [], 1: [], 2: [], 3: [], 4: []}
# а теперь внимание
d0 = d[0]
d0.append('a')
d
# {0: ['a'], 1: ['a'], 2: ['a'], 3: ['a'], 4: ['a']}
>>> l = []
>>> ll = [l, l]
>>> ll
[[], []]
>>> l.append(1)
>>> l
[[1], [1]]
ZZZКак это не глюк и не фича, т.е. вообще “ни рыба ни мясо”? И при чём здесь ООП?
Это не глюк и не фитча, а просто непонимание принципов ООП.
ZZZЛадно не отвлекаясь от темы, мне не надо весь словарь заполнять, мне надо поэлементно как
P.S. Код заполнения словаря взрывает мозг.
d[0] = d[0]+['a']
alexx11Странный Вы какой-то. Питоном пользуются тысячи людей, вы, найдя какое-то непонятно для Вас поведение в базовой по сути фиче, пытаетесь себя убедить что это баг, и что никто до этого не наступал на него?
НО возвращась к утверждению что это всё ж глюк: после единоразового обращения по индексу append начинает работать.
>>> l = []
>>> id(l)
3084811852L
>>> d = {1: l, 2: l}
>>> d
{1: [], 2: []}
>>> id(d[1]), id(d[2])
(3084811852L, 3084811852L)
>>> d[1].append('a')
>>> d
{1: ['a'], 2: ['a']}
>>>
alexx11Зря.
о я просто становлюсь помешанным когда речь идёт об оптимизации кода
DaevaornОни и видно.
Говоря проще, все значения в дикте у Вас – это ссылки один и тот же объект.