2011-11-20 9 views
8

मुझे सूचियों के व्यवहार को समझने में थोड़ी सी समस्या है।उस सूची में एक मान को सूची सौंपना

मेरे व्यायाम सवाल यह है: निम्नलिखित बयानों का असर दिखा एक स्मृति मॉडल ड्रा:

values = [0, 1, 2] 
values[1] = values 

मेरे सोच यह थी कि इन बयानों को क्रियान्वित करने में, इस [0, [0, 1, 2], 3] की तरह कुछ करने के लिए सूची बदल जाएगा दूसरे शब्दों में दूसरा कथन सूची में दूसरा मान जोड़ देगा (1) लेकिन जब मैं इन कथनों को निष्पादित करता हूं और फिर पायथन शेल (3.2) में सूची मुद्रित करता हूं तो मुझे निम्नलिखित परिणाम मिलते हैं:

[0, [...], 2] 

दूसरी प्रविष्टि के साथ कुछ हुआ है लेकिन मुझे यकीन नहीं है कि क्या कोई समझा सकता है कि क्या हुआ है?

धन्यवाद, डेमियन

उत्तर

13

आपने एक रिकर्सिव डेटा संरचना बनाई है। सूची में दूसरा तत्व सूची का संदर्भ है। जब आप इसे प्रिंट करते हैं, तो आमतौर पर आप दूसरे प्रश्न में मूल सूची देखने की उम्मीद करेंगे, जैसा कि आप अपने प्रश्न में सुझाव देते हैं।

हालांकि, अगर आप मूल सूची की एक प्रति डालने नहीं कर रहे हैं, आप वास्तविक सूची में एक संदर्भ डालने कर रहे हैं। तो, दूसरे तत्व को पूरी सूची मुद्रित करनी होगी। लेकिन, इस दूसरे तत्व का दूसरा तत्व स्वयं सूची का संदर्भ है, इसलिए जब यह प्रिंट करता है तो दूसरा तत्व, .... पाइथन [...] प्रदर्शित करके इसे संभालता है क्योंकि एकमात्र अन्य समाधान एक अनंत सेट पेश करना है नेस्टेड सूचियां

इसे इस तरह की कल्पना कीजिए:

[0, <pointer to itself>, 2] 
:

[0, <pointer to itself>, 2] 
बेशक, <pointer to itself>, जब बाहर मुद्रित के

, की तरह दिखता है: values[1] को अपना असाइनमेंट के बाद, अपनी सूची में इस तरह देखने के लिए सोचा जा सकता है

जब आप उन एक साथ रखा, आपको मिलता है:

[0, [0, <pointer to itself>, 2], 2] 

लेकिन जाहिर है, मुद्रित करने के लिए है कि अंतरतम <pointer to itself> यह भी मुद्रित किया जाना चाहिए:

[0, [0, [0, <pointer to itself>, 2], 2], 2] 

... और इतने पर। यह सभी तरह से कछुए है।

+0

कछुए के लिए +1 :) –

+0

@ ब्रायन ओकले, आपके उत्तर के लिए धन्यवाद, यह एक महान स्पष्टीकरण है। यह सभी संदर्भ/प्रतिलिपि के लिए उबलता है जिसे मुझे अधिक सतर्क रहने की आवश्यकता है। –

3

तुम सचमुच ही में एक सूची डालने कर रहे हैं। जिसके परिणामस्वरूप सूची अब और मुद्रित नहीं किया जा सकता क्योंकि यह कुछ हद तक एक सर्कल में चला जाता है:

values = [0, 1, 2] 
values[1] = values 
# so the list now looks like 
[0, values, 2] 
# so we expand the variable and get 
[0, [0, values, 2], 2] 
# and so on 
[0, [0, [0, values, 2], 2], 2] 
# as this will never end instead Python prints 
[0, [...], 2] 

तो [...] मतलब यह है कि सूची में ही होता है।

0

एक है कि आप के लिए काम करता है:

values = [0, 1, 2] 
values[1] = values[:] # or list(values) 

सूचियों और संदर्भ को कॉपी करने की अधिक जानकारी के लिए here देखते हैं।

+2

मैं नीचे मतदान कर रहा हूं क्योंकि यह सवाल का जवाब नहीं देता है। सवाल यह नहीं है कि सूची में किसी सूची की एक प्रति कैसे स्टोर करें। सवाल यह है, "समझाएं कि जब आप किसी सूची में तत्व को स्वयं के संदर्भ में सेट करते हैं तो क्या होता है"। यह उत्तर कोई स्पष्टीकरण प्रदान करता है, केवल एक कामकाज। जबकि आप जो भी कहते हैं वह बहुत उपयोगी सलाह है, यह इस प्रश्न के संदर्भ में उपयोगी नहीं है। –

+1

@ ब्रायन ओकले: हालांकि यह मूल प्रश्न का उत्तर नहीं देता है, यह एकमात्र प्रविष्टि है जो वास्तव में आपको बताती है कि यह कैसे करें, और उस व्यावहारिक दृष्टिकोण के लिए निश्चित रूप से एक उत्थान का हकदार है। –

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