अजगर: एक सूची में एक शब्दकोश लागू करना - मुझे व्यवहार की तरह एक संकेतक दिखाई देता है


85

मैंने अजगर दुभाषिया में निम्नलिखित की कोशिश की:

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

यहाँ, 'b' को 'a' की सूची में शामिल करने के बाद, मैं 'a' के शब्दकोश में कुंजी 1 के अनुरूप मान बदल रहा हूँ। किसी तरह यह परिवर्तन सूची में भी परिलक्षित होता है। जब मैं एक सूची में एक शब्दकोश संलग्न करता हूं, तो क्या मैं केवल शब्दकोश के मूल्य को जोड़ नहीं रहा हूं? ऐसा लगता है कि मैंने सूची में एक सूचक को सूची में जोड़ दिया है और इसलिए शब्दकोश में परिवर्तन भी सूची में दिखाई दे रहे हैं।

मैं नहीं चाहता कि परिवर्तन सूची में परिलक्षित हो। मैं यह कैसे करुं?

अपना समय देने के लिए धन्यवाद!


चेखव यह शब्दकोश 'बी' नहीं है , यह या तो शब्दकोश बी है या नाम 'बी' का शब्दकोश है । वैसे, आपने गलती के साथ लिखा: "मैं शब्दकोश 1 में शब्दकोश 'ए' में कुंजी 1 के अनुरूप मूल्य बदल रहा हूं । अपने विस्मय को लेकर: कोई सूची मूल्य नहीं रखती है, यह वस्तुओं को रखती है, क्योंकि सभी पायथन में ऑब्जेक्ट है। या अधिक सटीक रूप से एक सूची वस्तुओं का संदर्भ रखती है।
आइकॉमी

चेखव आपको इस प्रश्न को भी देखना चाहिए: ( stackoverflow.com/questions/5242933/… )
eyquem

@ आपकी टिप्पणी के लिए धन्यवाद। मैं जल्दी में यह पोस्ट कर रहा था। मैं क्षमाप्रार्थी हूं।
नव 29

चेखव यह एक निंदा नहीं था, यह केवल जानकारी थी। वैसे, यदि मेरा उत्तर कुछ उपयोगी है, तो इसे अपडाउन किया जा सकता है। इसके अलावा, आप उत्तरों में से एक उत्तर को "स्वीकार" करना चुन सकते हैं, एक उत्तर के बाईं ओर बिंदु काउंटर के नीचे शेवरॉन के आकार की पट्टी पर क्लिक करके, यह 25 अंक प्राप्त करेगा। या आप किसी भी प्रश्न को स्वीकार नहीं करने का विकल्प चुन सकते हैं।
सुबह

जवाबों:


140

आप सही हैं कि आपकी सूची में ए शामिल है मूल शब्दकोश का संदर्भ है।

a.append(b.copy()) चाल चलनी चाहिए।

ध्यान रखें कि यह उथली प्रतिलिपि बनाता है। एक विकल्प का उपयोग करना है copy.deepcopy(b), जो एक गहरी प्रतिलिपि बनाता है।


6
बहुत बढ़िया! मैं इस पर लंबे समय से अवरुद्ध था
यासीन

2
यह लगभग आधे घंटे के लिए मेरे दिमाग को उड़ा रहा था जब तक कि मैंने हार नहीं मानी और स्टैक की जांच करने का फैसला किया।
फ्लाइंगज़ेब्रा 1

35

तानाशाह के साथ भी

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

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

परिणाम

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

यकीन नहीं है कि यह कॉपी () के रूप में काफी तेज है, लेकिन डीपकोपी () से तेज है। शायद जटिल शब्दकोश स्कीमा के साथ यह डीपकोपी () के करीब होगा क्योंकि तानाशाही () एक नया शब्दकोश बनाता है।
सेलोटेक

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.