python: การต่อท้ายพจนานุกรมในรายการ - ฉันเห็นตัวชี้ลักษณะการทำงาน


88

ฉันลองสิ่งต่อไปนี้ในตัวแปล python:

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

ที่นี่หลังจากต่อท้ายพจนานุกรม 'b' เข้ากับรายการ 'a' ฉันจะเปลี่ยนค่าที่ตรงกับคีย์ 1 ในพจนานุกรม 'a' อย่างไรก็ตามการเปลี่ยนแปลงนี้จะปรากฏในรายการด้วย เมื่อฉันผนวกพจนานุกรมเข้ากับรายการฉันไม่เพียง แต่ต่อท้ายค่าของพจนานุกรมเท่านั้นหรือ ดูเหมือนว่าฉันได้เพิ่มตัวชี้ไปยังพจนานุกรมในรายการและด้วยเหตุนี้การเปลี่ยนแปลงในพจนานุกรมจึงปรากฏในรายการด้วย

ฉันไม่ต้องการให้การเปลี่ยนแปลงปรากฏในรายการ ฉันต้องทำอย่างไร?

ขอขอบคุณสำหรับเวลาของคุณ!


เช็กฮอมันไม่ได้เป็นพจนานุกรม 'B'มันเป็นทั้งขพจนานุกรมหรือพจนานุกรมชื่อ 'B' คุณเขียนผิด: "ฉันกำลังเปลี่ยนค่าที่ตรงกับคีย์ 1 ในพจนานุกรม" a ""ไม่ใช่ในพจนานุกรม b เกี่ยวกับความประหลาดใจของคุณ: รายการไม่เก็บค่ามันเก็บวัตถุเนื่องจากทั้งหมดเป็นวัตถุใน Python หรือมากกว่านั้นคือรายการที่มีการอ้างอิงถึงวัตถุ
eyquem

Chekhov คุณควรเห็นคำถามนี้: ( stackoverflow.com/questions/5242933/… )
eyquem

@eyquem ขอบคุณสำหรับความคิดเห็นของคุณ ฉันกำลังโพสต์สิ่งนี้อย่างเร่งรีบ ขอโทษด้วย.
neo29

เชคอฟไม่ใช่คำตำหนิ แต่เป็นเพียงข้อมูลเท่านั้น ยังไงก็ตามถ้าคำตอบของฉันมีประโยชน์บ้างก็สามารถเพิ่มคะแนนได้ นอกจากนี้คุณสามารถเลือก "ยอมรับ" หนึ่งคำตอบจากคำตอบโดยคลิกที่แถบรูปตัววีใต้ตัวนับคะแนนทางด้านซ้ายของคำตอบหนึ่งคำตอบจะได้รับ 25 คะแนน หรือคุณสามารถเลือกที่จะไม่ยอมรับคำถามใด ๆ
eyquem

คำตอบ:


146

คุณถูกต้องในรายการของคุณมีข้อมูลอ้างอิงถึงพจนานุกรมต้นฉบับ

a.append(b.copy()) ควรทำเคล็ดลับ

โปรดจำไว้ว่านี่เป็นการทำสำเนาแบบตื้น ๆ อีกทางเลือกหนึ่งคือใช้copy.deepcopy(b)ซึ่งทำสำเนาแบบลึก


6
สุดยอด! ฉันถูกบล็อกเป็นเวลานานในเรื่องนี้
Yasin

2
สิ่งนี้ทำให้ฉันนึกถึงประมาณครึ่งชั่วโมงจนกระทั่งฉันยอมแพ้และตัดสินใจดูกอง
FlyingZebra1

35

ยังมีdict

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

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

ผลลัพธ์

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

ไม่แน่ใจว่าเร็วพอที่ copy () หรือเปล่า แต่ดูเหมือนว่าจะเร็วกว่า deepcopy () อาจจะมีสคีมาพจนานุกรมที่ซับซ้อนมันจะใกล้เคียงกับ deepcopy () เนื่องจาก dict () สร้างพจนานุกรมใหม่
selotec

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.