आप जो अनुभव कर रहे हैं वह संदर्भों की अवधारणा है। अजगर में सभी वस्तुओं के लिए एक संदर्भ है और जब आप एक से दो नामों a
और b
असाइन करते हैं, इस a
और b
दोनों ही वस्तु की ओर इशारा करते का परिणाम है।
>>> a = range(3)
>>> b = a # same object
>>> b.append(3)
>>> a, b # same contents
([0, 1, 2, 3], [0, 1, 2, 3])
सूचियों के साथ, आप एक नकल एक और a
b = a[:]
का उपयोग करने का एक नई सूची b
है कि बनाने के कर सकते हैं।
>>> a = range(3)
>>> b = a[:] # make b a new copy of a
>>> b.append(3)
>>> a, b # a is left unchanged
([0, 1, 2], [0, 1, 2, 3])
किसी भी वस्तु के लिए एक अधिक सामान्य समाधान के लिए, copy module का उपयोग करें। एक उथली प्रतिलिपि आपके द्वारा कॉपी की जा रही वस्तु के भीतर संग्रहीत संदर्भों की प्रतिलिपि बनायेगी, जबकि एक गहरी प्रतिलिपि सभी वस्तुओं की नई प्रतियों को दोबारा बनायेगी।
>>> a = [range(2), range(3)]
>>> b = copy.copy(a) # shallow copy of a, equivalent to a[:]
>>> b[0] = range(4)
>>> a, b # setting an element of b leaves a unchanged
([[0, 1], [0, 1, 2]], [[0, 1, 2, 3], [0, 1, 2]])
>>> b[1].append(3)
>>> a, b # modifying an element of b modifies the element in a
([[0, 1], [0, 1, 2, 3]], [[0, 1, 2, 3], [0, 1, 2, 3]])
>>> a = [range(2), range(3)]
>>> b = copy.deepcopy(a) # deep recursive copy of a
>>> b[1].append(3)
>>> a, b # modifying anything in b leaves a unchanged
([[0, 1], [0, 1, 2]], [[0, 1], [0, 1, 2, 3]])
ठीक है, आप पाइथन को नहीं जानते हैं। या कम से कम आप इसका एक महत्वपूर्ण हिस्सा नहीं जानते हैं, कौन से चर हैं। SO या उदा। पर समान प्रश्न देखें http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have-variables। – delnan
@ डेलनान निष्पक्ष होने के लिए, यह उन लोगों के लिए असामान्य गड़बड़ी नहीं है जो पाइथन के लिए नए हैं, यह समझने के लिए कि वेरिएबल असाइनमेंट जिसमें सूचियां शामिल हैं, संदर्भों को निर्दिष्ट करती हैं, हालांकि दावा "मैंने सोचा था कि मुझे पाइथन पता था" यह इंगित करता है कि वे "नया" नहीं हैं:) –