दिलचस्प पोस्ट
एक एमजीओ सत्र बनाए रखने के लिए सर्वश्रेष्ठ अभ्यास क्वेरी पर एंड्रॉइड जीपीएस गलत स्थान डेटा BinaryWriter Endian समस्या एक चर से बनाए गए वर्गों के साथ नामस्थान का उपयोग करना मैं mysqldump से छोटी फ़ाइलों में कैसे आउटपुट कर सकता हूं? जावास्क्रिप्ट में मामला असंवेदनशील regex GWT शेड्यूलर का उपयोग करना फोर्स-निर्देशित लेआउट में नए नोड्स को जोड़ना एंड्रॉइड: क्या नए संदेशों की संख्या दिखाने के लिए एक संख्या के साथ एक छवि दृश्य / छवि बटन अद्यतन करना संभव है? PHP में स्थैतिक तरीकों की जड़ें? बाइंडिंग लिस्ट <T> में डाटाग्रीड दृश्य में WinForm मैं एंड्रॉइड एप्लिकेशन में वेब सर्वर से डेटा कैसे ला सकता हूं? जांचें कि दो सूचियां समान हैं एसक्यूएल में शीर्ष और सीमा खोजशब्द के बीच अंतर सी भाषा में "विस्तृत वर्ण स्ट्रिंग" क्या है?

पायथन सूची भ्रम

मान लें कि मेरे पास निम्न कोड है:

a_list = [[0]*10]*10 

यह निम्न सूची बनाता है:

 [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] 

फिर मैं पहली सूची में पहला तत्व संशोधित करना चाहता हूं:

 a_list[0][0] = 23 

मुझे केवल सूची के पहले तत्व को संशोधित करने की उम्मीद है, लेकिन वास्तव में प्रत्येक सूची का पहला तत्व बदल गया था:

 [[23, 0, 0, 0, 0, 0, 0, 0, 0, 0], [23, 0, 0, 0, 0, 0, 0, 0, 0, 0], [23, 0, 0, 0, 0, 0, 0, 0, 0, 0], [23, 0, 0, 0, 0, 0, 0, 0, 0, 0], [23, 0, 0, 0, 0, 0, 0, 0, 0, 0], [23, 0, 0, 0, 0, 0, 0, 0, 0, 0], [23, 0, 0, 0, 0, 0, 0, 0, 0, 0], [23, 0, 0, 0, 0, 0, 0, 0, 0, 0], [23, 0, 0, 0, 0, 0, 0, 0, 0, 0], [23, 0, 0, 0, 0, 0, 0, 0, 0, 0]] 

मैं इस से बचने के लिए अपने डेटा का प्रतिनिधित्व करने के लिए एक और रास्ता खोज रहा था लेकिन ऐसा क्यों हो रहा है? सिर्फ पहली सूची क्यों नहीं बदली गई है? जब मैं दूसरा *10 करता हूं, तो क्या पायथन वास्तव में एक नई स्मृति ब्लॉक आवंटित करने के बजाय पहली सूची के पते की प्रतिलिपि बनाता है?

Solutions Collecting From Web of "पायथन सूची भ्रम"

प्रतिलिपि पते के बारे में आपका कूड़ा सही है इसके बारे में कुछ इस तरह सोचें:

 sub_list = [0] * 10 a_list = [sub_list] * 10 

यह कोड आपके द्वारा ऊपर लिखे गए कोड के बराबर है। इसका क्या मतलब यह है कि आप वास्तव में एक ही सूची sub_list बदल रहे हैं जब भी आप sub_list कोई भी तत्व बदलते हैं आप इसे टाइप करके भी सुनिश्चित कर सकते हैं:

 a_list = [[0] * 10] * 10 for n in a_list: print id(n) 

और यह प्रत्येक तत्व के लिए समान दिखाई देगा। इसका समाधान करने के लिए, आपको इसका उपयोग करना चाहिए:

 a_list = [[0] * 10 for _ in range(10)] 

a_list प्रत्येक तत्व के लिए एक नया a_list बनाने के लिए

सूचियों में वस्तुओं के संदर्भ होते हैं सूचियों पर गुणा केवल संदर्भ को दोहराता है (वही वस्तुओं में!)। हालांकि यह अपरिवर्तनीय वस्तुओं (जैसे पूर्णांक) के लिए ठीक है, वही सूची प्राप्त करने के लिए आपको क्या मिल रहा है

इस पैटर्न [[0]*10 for _ in xrange(10)] साथ अलग सूचियां बनाएं।

सिर्फ पहली सूची क्यों नहीं बदली गई है?

कारण सरल है, वास्तव में केवल 1 सूची है, न कि 10 – जैसा कि आप पहले से ही संदेह करते हैं:

 In [1]: [[0]*10]*10 Out[1]: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] In [2]: map(id, _) Out[2]: [54094624, 54094624, 54094624, 54094624, 54094624, 54094624, 54094624, 54094624, 54094624, 54094624] 

यदि आप 10 सूचियां बनाना चाहते हैं, तो आप इसे आसानी से प्राप्त कर सकते हैं जैसे अभिव्यक्ति के द्वारा

 [[0]*10 for x in xrange(10)]