2011-11-14 13 views
15

मुझे पाइथन में एक साधारण समस्या है जो बहुत अजीब है।कॉपी किए गए चर मूल को बदलते हैं?

def estExt(matriz,erro): 
    # (1) Determinar o vector X das soluções 
    print ("Matrix after:"); 
    print(matriz); 

    aux=matriz; 
    x=solucoes(aux); # IF aux is a copy of matrix, why the matrix is changed?? 

    print ("Matrix before: "); 
    print(matriz) 

... 

आप नीचे देख के रूप में, मैट्रिक्स matriz तथ्य यह है कि aux एक समारोह solucoes() द्वारा बदला जा रहा है के बावजूद बदल जाता है।

मैट्रिक्स से पहले:
[[7, 8, 9, 24], [8, 9, 10, 27], [9, 10, 8, 27]]

मैट्रिक्स के बाद:
[[7, 8, 9, 24], [0.0, -0.14285714285714235, -0.2857142857142847, -0.42857142857142705], [0.0, 0.0, -3.0, -3.0000000000000018]]

उत्तर

31

लाइन

aux=matriz; 

matriz की एक प्रतिलिपि बनाने नहीं करता है, यह महज aux नामित matriz के लिए एक नया संदर्भ बनाता है। आप शायद

aux=matriz[:] 

जो एक प्रति उपलब्ध कराएगा चाहते हैं, यह सोचते हैं matriz एक सरल डेटा संरचना है। यदि यह अधिक जटिल है, तो आप शायद copy.deepcopy

aux = copy.deepcopy(matriz) 

एक के रूप में एक तरफ का उपयोग करना चाहिए, आप अर्द्ध कोलन की जरूरत नहीं है प्रत्येक कथन के बाद, अजगर EOL मार्कर के रूप में उन्हें का उपयोग नहीं करता।

+0

हाय, आपके उत्तर के लिए धन्यवाद =) लेकिन मेरे पास इस तथ्य पर विचार करने का एक और सवाल है: यदि बी = 1 और ए = बी, यदि हम एक = 3 बदलते हैं, तो बी पायथन में नहीं बदला जाता है। क्यूं कर? धन्यवाद =) –

+4

क्योंकि आप किसी भिन्न ऑब्जेक्ट (पूर्णांक '3') को इंगित करने के लिए' a' बदल रहे हैं, लेकिन 'b' को नहीं बदल रहे हैं, इसलिए यह अभी भी' 1' को इंगित करता है। – kindall

2

auxनहींmatrix की एक प्रति है, यह सिर्फ एक अलग नाम है कि एक ही वस्तु को संदर्भित करता है।

अपनी वस्तुओं की वास्तविक प्रतियां बनाने के लिए copy module का उपयोग करें।

9

उपयोग copy मॉड्यूल

aux = copy.deepcopy(matriz) # there is copy.copy too for shallow copying 

माइनर एक: अर्धविराम आवश्यक नहीं हैं।

+0

आपके उत्तर के लिए धन्यवाद =) –

+1

stackoverflow @ AndréFreitas में आपका स्वागत है। आमतौर पर यहां, इसे एक जवाब स्वीकार करने के लिए एक अच्छा सामुदायिक अभ्यास माना जाता है (जिसे आप सबसे अच्छा मानते हैं, जरूरी नहीं है)। – Shekhar

संबंधित मुद्दे