python: Додавання словника до списку - я бачу поведінку, подібну до вказівника


85

Я спробував наступне в інтерпретаторі python:

>>>
>>> a = []
>>> b = {1:'one'}
>>> a.append(b)
>>> a
[{1: 'one'}]
>>> b[1] = 'ONE'
>>> a
[{1: 'ONE'}]
>>>

Тут, після додавання словника "b" до списку "a", я змінюю значення, яке відповідає клавіші 1 у словнику "a". Якось ця зміна також відображається у списку. Коли я додаю словник до списку, я не просто додаю значення словника? Схоже, я додав до списку вказівник на словник, а отже, зміни в словнику також відображаються у списку.

Я не хочу, щоб зміни відображались у списку. Як це зробити?

Спасибі за ваш час!


Чехов Це не словник "b" , це або словник b, або словник імені "b" . До речі, ви помилково написали: "Я змінюю значення, яке відповідає ключу 1 у словнику 'a'" Ні, у словнику b. Щодо вашого здивування: список не містить значень, він містить об'єкти, оскільки все є об'єктом у Python. Або точніше, список містить посилання на об'єкти.
eyquem

Чехов Ви повинні також бачити це питання: ( stackoverflow.com/questions/5242933 / ... )
Eyquem

@eyquem дякую за ваш коментар. Я розміщував це поспіхом. Мої вибачення.
neo29

Чехов Це був не докір, це була лише інформація. До речі, якщо моя відповідь є дещо корисною, її можна проголосувати. Крім того, ви можете вибрати "прийняти" одну відповідь серед відповідей, натиснувши шевронну смужку під лічильником очок зліва від однієї відповіді, вона набере 25 балів. Або ви можете не приймати жодного запитання.
eyquem

Відповіді:


140

Ви маєте рацію, оскільки ваш список містить посилання на оригінальний словник.

a.append(b.copy()) повинен зробити трюк.

Майте на увазі, що це робить неглибоку копію. Альтернативою є використання copy.deepcopy(b), яке робить глибоку копію.


6
чудово! У цьому мене довго заблокували
Ясін,

2
це дуло мені на думку близько півгодини, поки я не здався і вирішив перевірити стек.
FlyingZebra1,

35

Також з диктом

a = []
b = {1:'one'}

a.append(dict(b))
print a
b[1]='iuqsdgf'
print a

результат

[{1: 'one'}]
[{1: 'one'}]

Не впевнений, що це досить швидко як copy (), але, здається, швидше, ніж deepcopy (). Можливо, зі складною схемою словника це буде близько до deepcopy (), оскільки dict () створює новий словник.
selotec

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.