python: Listeye bir sözlük eklemek - İşaretçi benzeri bir davranış görüyorum


88

Python yorumlayıcısında aşağıdakileri denedim:

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

Burada, 'b' sözlüğünü 'a' listesine ekledikten sonra, 'a' sözlüğündeki 1 anahtarına karşılık gelen değeri değiştiriyorum. Her nasılsa bu değişiklik listeye de yansıyor. Listeye bir sözlük eklediğimde, sadece sözlüğün değerini eklemiyor muyum? Listeye sözlüğe bir işaretçi eklemiş gibi görünüyor ve bu nedenle sözlükte yapılan değişiklikler de listeye yansıtılıyor.

Değişikliğin listeye yansımasını istemiyorum. Nasıl yaparım?

Zaman ayırdığınız için teşekkür ederim!


Çehov Bu sözlük 'b' değil, ya sözlük b ya da 'b' adının sözlüğü . Bu arada, yanlış yazmışsın: "Sözlük 'a' daki tuş 1'e karşılık gelen değeri değiştiriyorum" Hayır, sözlükte b. Şaşkınlığınızla ilgili olarak: Python'da her şey nesne olduğu için bir liste değerleri tutmaz, nesneleri tutar. Ya da daha doğrusu bir liste nesnelere referanslar içerir.
eyquem

Chekhov Şu soruyu da görmelisiniz: ( stackoverflow.com/questions/5242933/… )
eyquem

@eyquem yorumunuz için teşekkürler. Bunu aceleyle gönderiyordum. Özür dilerim.
neo29

Çehov Bu bir suçlama değil, sadece bilgiydi. Bu arada, cevabım biraz işe yararsa, olumlu oy verilebilir. Ayrıca cevaplar arasından bir cevabı "kabul etmeyi" seçebilirsiniz, bir cevabın solundaki puan sayacının altında bulunan köşeli çift ayraç şeklindeki şeride tıklayarak 25 puan kazanacaktır. Veya herhangi bir soruyu kabul etmemeyi seçebilirsiniz.
eyquem

Yanıtlar:


145

Listenizin orijinal sözlüğe bir referans içerdiği konusunda haklısınız .

a.append(b.copy()) hile yapmalı.

Bunun sığ bir kopya oluşturduğunu unutmayın. Bir alternatif, copy.deepcopy(b)derin bir kopya oluşturan kullanmaktır .


6
harika! Bu konuda uzun süre bloke edildim
Yasin

2
Bu, pes edip yığını kontrol etmeye karar verene kadar yaklaşık yarım saat boyunca aklımı uçuruyordu.
FlyingZebra 1

35

Ayrıca dikte ile

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

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

sonuç

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

Copy () kadar hızlı olup olmadığından emin değilim, ancak deepcopy () 'den daha hızlı görünüyor. Belki karmaşık sözlük şemasıyla deepcopy () 'ye yakın olur çünkü dict () yeni bir sözlük oluşturur.
selotec

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.