Может ли кто-нибудь помочь объяснить, почему значения в словаре меняются при использовании 'append'.

dic1 = {1:[[1],[2]]}
for x in dic1.keys():
    for tt in dic1[x]:
        print tt
        tt = tt + [1]
        print tt
dic1

Выход:

[1]
[1, 1]
[2]
[2, 1]
Out[67]:
{1: [[1], [2]]}

Тем не мение

dic1 = {1:[[1],[2]]}
for x in dic1.keys():
    for tt in dic1[x]:
        print tt
        tt.append("s")
        print tt
dic1

Вывод - если вместо «плюс» использовать append, dic1 изменился

[1]
[1, 's']
[2]
[2, 's']
Out[68]:
{1: [[1, 's'], [2, 's']]}
0
karlhuggle 27 Фев 2018 в 20:46

3 ответа

Лучший ответ

Это потому, что tt в tt = tt + [1] является локальным именем, а не внутри dic1. Таким образом, вы изменили значение этого локального имени, а не значение внутри dic1.

Если вы хотите изменить сам объект, как в первом решении, используйте tt[:]:

dic1 = {1:[[1],[2]]}
for x in dic1.keys():
    for tt in dic1[x]:
        print tt
        tt[:] = tt + [1]
        print tt
1
llllllllll 27 Фев 2018 в 17:52

Это происходит потому, что списки изменчивы и append изменяет сам объект, а не создает новый.

В первом случае + фактически создает новый объект, поэтому исходный tt в словаре не изменяется.

Однако во втором случае append изменяет tt фактического словаря

0
ted 27 Фев 2018 в 17:55

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

list = [1,2,3]
print(id(list))
list.append(1)
print(id(list))
list = list + [1]
print(id(list))

Другими словами, append не создает новый объект в памяти, он просто модифицирует уже существующий объект, тогда как сложение создает совершенно новый объект. В контексте словаря это означает, что значения в нем изменяются при использовании append.

0
RandomBob 27 Фев 2018 в 17:55