Взаимодействие между словарем и списками - PullRequest
0 голосов
/ 26 марта 2019

Относительно плохо знакомый с Python, я заметил странное поведение, когда пытался использовать список типа «журнал» для регистрации обновления словаря.

Исходный код действительно сложный, поэтому я разбил его, чтобы воспроизвести битэто не действует так, как я ожидал

У меня есть список, который будет преобразован в словарь

list2conv = ['Key1', 'Key2']

преобразовать его в словарь

d_fromList = dict.fromkeys(list2conv)

for i in d_fromList:
    d_fromList[i] = [0, 0]

Созданиесписок вывода, который будет являться своего рода журналом операций, выполняемых в словаре, и с добавлением некоторых значений

outList = []

for i in range(0, 3):
    d_fromList['Key1'][0] = d_fromList['Key1'][0] + 10
    d_fromList['Key2'][1] = d_fromList['Key2'][1] + 20
    outList.append(d_fromList['Key1'])
    outList.append(d_fromList['Key2'])

Фактический результат

[[30, 0], [0, 60], [30, 0], [0, 60], [30, 0], [0, 60]] 

Что бы я ожидал

[[10, 0], [0, 20], [20, 0], [0, 40], [30, 0], [0, 60]]

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 26 марта 2019

В вашем коде есть ошибка:

    d_fromList['Key2'][1] = d_fromList['Key1'][1] + 20

должно быть

    d_fromList['Key2'][1] = d_fromList['Key2'][1] + 20
1 голос
/ 26 марта 2019

То, что вы испытываете, называется псевдонимами.Это происходит, когда вы начинаете играть с вложенными списками / dict.Вот краткое прочтение: http://www.cs.rpi.edu/~sibel/csci1100/fall2015/course_notes/exam2_review/aliasing.html

Быстрое исправление:

for i in range(0, 3):
    d_fromList['Key1'][0] = d_fromList['Key1'][0] + 10
    d_fromList['Key2'][1] = d_fromList['Key2'][1] + 20
    outList.append(d_fromList['Key1'][:]) # copies the list
    outList.append(d_fromList['Key2'][:]) # copies the list
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...