अजगर:अजगर सूची समस्या
m=[[0]*3]*2
for i in range(3):
m[0][i]=1
print m
मैं उम्मीद करते हैं कि इस कोड
[[1, 1, 1], [0, 0, 0]]
प्रिंट चाहिए लेकिन यह
[[1, 1, 1], [1, 1, 1]]
अजगर:अजगर सूची समस्या
m=[[0]*3]*2
for i in range(3):
m[0][i]=1
print m
मैं उम्मीद करते हैं कि इस कोड
[[1, 1, 1], [0, 0, 0]]
प्रिंट चाहिए लेकिन यह
[[1, 1, 1], [1, 1, 1]]
इस डिजाइन के द्वारा होता है प्रिंट करता है। जब आप किसी सूची के तत्वों पर गुणा का उपयोग करते हैं, तो आप संदर्भों को पुन: उत्पन्न कर रहे हैं।
the section "List creation shortcuts" on the Python Programming/Lists wikibook देखें जो म्यूटेबल ऑब्जेक्ट्स के सूची संदर्भों के साथ मुद्दों पर विस्तार से जाता है।
>>> s = [[0]*3 for i in range(2)]
>>> s
[[0, 0, 0], [0, 0, 0]]
>>> s[0][1] = 1
>>> s
[[0, 1, 0], [0, 0, 0]]
इसमें कुछ समय शैतानी, लेकिन काफी स्पष्ट है, जब आप समझते हैं कि आप क्या कर रहे हैं:
उनकी सिफारिश की वैकल्पिक हल एक सूची समझ है। जब आप [[0]*3]*2
बिट कर रहे हैं, तो आप पहले 3 शून्य के साथ एक सूची बना रहे हैं, फिर आप इसे दो तत्व बनाने के लिए प्रतिलिपि बनाते हैं। लेकिन जब आप उस प्रतिलिपि करते हैं, तो आप एक ही सामग्री के साथ नई सूचियां नहीं बनाते हैं, बल्कि कई बार एक ही सूची का संदर्भ देते हैं। तो जब आप एक बदलते हैं, तो वे सभी बदल जाते हैं।
एक उदाहरण यह उजागर करने के लिए:
In [49]: s = [[]]*2 # Create two empty lists
In [50]: s # See:
Out[50]: [[], []]
In [51]: s[0].append(2) # Alter the first element (or so we think)
In [52]: s # OH MY, they both changed! (because they're the same list!)
Out[52]: [[2], [2]]