पायथन सूची स्लाइस के साथ कैसे काम करता है?


102

पाइथन डॉक का कहना है कि किसी सूची को खंगालना एक नई सूची देता है।
अब अगर एक "नई" सूची वापस की जा रही है तो मुझे "स्लाइस को असाइनमेंट" से संबंधित निम्नलिखित प्रश्न करने होंगे।

a = [1, 2, 3]
a[0:2] = [4, 5]
print a

अब उत्पादन होगा:

[4, 5, 3] 
  1. जो कुछ वापस कर रहा है वह अभिव्यक्ति के बाईं ओर कैसे आ सकता है?
  2. हां, मैं डॉक्स पढ़ता हूं और यह कहता है कि यह संभव है, अब चूंकि एक सूची को स्लैब करने से "नई" सूची लौटती है, इसलिए मूल सूची को संशोधित क्यों किया जा रहा है? मैं इसके पीछे के मैकेनिक्स को समझने में सक्षम नहीं हूं।

@ मर्क लोंगेर अफसोस मुझे लगा कि केवल कोड को आउटपुट नहीं स्वरूपित किया जाना चाहिए
कार्तिक आनंद


7
क्या आप समझते हैं कि क्या a[0] = 4होगा?
जोश ली

1
@KartikAnand स्लाइस असाइनमेंट एक विशेष परिदृश्य है जहाँ नई सूची नहीं बनाई जाती है। इसका कोई मतलब नहीं है कि बिना किसी वस्तु के नाम के एक वस्तु को बाईं ओर =बाँध कर बनाया जा सकता है , इसलिए इसे अमान्य वाक्यविन्यास के रूप में छोड़ने के बजाय, अजगर इसे कुछ और कर देता है जैसे कि आप क्या उम्मीद कर सकते हैं। चूंकि अजगर के संदर्भ नहीं हैं, इसलिए यह मूल सूची में एक स्लाइस परिवर्तन के परिणामस्वरूप काम नहीं करेगा। आपको एक प्रति मिलती है। यदि आपने अपने आवेदन पर अधिक जानकारी प्रदान की है, तो हम आपको 'पाइथोनिक' तरीके से चीजों को करने में बेहतर मदद करने में सक्षम हो सकते हैं। :)
केसी कुबाल

1
@ डार्थफेट मैं अभी किसी भी एप्लीकेशन पर काम नहीं कर रहा हूं, बल्कि मैं अपने हाथों को गंदा करने से पहले खुद को अजगर सिखा रहा हूं :)
कार्तिक आनंद

जवाबों:


116

आप दो अलग-अलग ऑपरेशन को भ्रमित कर रहे हैं जो बहुत समान सिंटैक्स का उपयोग करते हैं:

1) टुकड़ा करने की क्रिया:

b = a[0:2]

यह स्लाइस की एक प्रति बनाता है aऔर इसे असाइन करता है b

2) टुकड़ा कार्य:

a[0:2] = b

यह की सामग्री के साथ टुकड़ा बदल देताa है b

हालांकि वाक्य रचना समान है (मैं डिजाइन द्वारा कल्पना करता हूं!), ये दो अलग-अलग ऑपरेशन हैं।


4
यही मेरा संदेह है, दूसरे मामले में, एक नई सूची का टुकड़ा क्यों नहीं है ??
कार्तिक आनंद

12
@KartikAnand क्योंकि यह नहीं है। वह भाषा निर्दिष्ट नहीं है।
मार्सिन

स्पष्ट होने के लिए, "वास्तव में इसका अर्थ है" का एक टुकड़ा लेता है "एक स्लाइस की एक प्रति बनाएं" जो कि भ्रम का हिस्सा है।
मार्क रैनसम

2
@ कर्णिकअनंद: असल में, हाँ। दुभाषिया जानता है कि कौन सा है, और उन्हें उचित तरीके से संभालता है।
एनपीई

1
@Dubslow: आप इटर्टूलस मॉड्यूल का उपयोग करके ऐसा कर सकते हैं । आपके मामले के लिए समारोह का उपयोग islice , साथ start=1, stop=None। यह किसी भी प्रतियां से बचने और आलसी मूल्यांकन का उपयोग करेगा (आपके मामले में आलसी पहुंच ओट मूल सूची)।
स्पिरोस

68

जब आप ऑपरेटर aके बाईं ओर निर्दिष्ट =करते हैं, तो आप पायथन के सामान्य असाइनमेंट का उपयोग कर रहे हैं , जो aनए संदर्भ को इंगित करने के लिए वर्तमान संदर्भ में नाम बदलता है । यह पिछले मान को aइंगित नहीं करता है जो इंगित कर रहा था।

ऑपरेटर a[0:2]के बाईं ओर निर्दिष्ट करके =, आप पायथन को बता रहे हैं कि आप स्लाइस असाइनमेंट का उपयोग करना चाहते हैं । स्लाइस असाइनमेंट सूचियों के लिए एक विशेष वाक्यविन्यास है, जहां आप सूची से सामग्री सम्मिलित, हटा सकते हैं या प्रतिस्थापित कर सकते हैं:

प्रविष्टि :

>>> a = [1, 2, 3]
>>> a[0:0] = [-3, -2, -1, 0]
>>> a
[-3, -2, -1, 0, 1, 2, 3]

विलोपन :

>>> a
[-3, -2, -1, 0, 1, 2, 3]
>>> a[2:4] = []
>>> a
[-3, -2, 1, 2, 3]

प्रतिस्थापन :

>>> a
[-3, -2, 1, 2, 3]
>>> a[:] = [1, 2, 3]
>>> a
[1, 2, 3]

ध्यान दें:

स्लाइस की लंबाई निर्धारित अनुक्रम की लंबाई से भिन्न हो सकती है, इस प्रकार लक्ष्य अनुक्रम की लंबाई को बदल सकता है, यदि लक्ष्य अनुक्रम इसकी अनुमति देता है। - स्रोत

स्लाइस असाइनमेंट, टपल अनपैकिंग के समान कार्य प्रदान करता है । उदाहरण के लिए, a[0:1] = [4, 5]इसके बराबर है:

# Tuple Unpacking
a[0], a[1] = [4, 5]

टपल अनपैकिंग के साथ, आप गैर-अनुक्रमिक सूचियों को संशोधित कर सकते हैं:

>>> a
[4, 5, 3]
>>> a[-1], a[0] = [7, 3]
>>> a
[3, 5, 7]

हालाँकि, टपल अनपैकिंग प्रतिस्थापन तक सीमित है, क्योंकि आप तत्वों को सम्मिलित या हटा नहीं सकते हैं।

इन सभी ऑपरेशनों से पहले और बाद में, aएक ही सटीक सूची है। पायथन बस एक सूची में जगह संशोधित करने के लिए अच्छा वाक्यविन्यास चीनी प्रदान करता है।


6
समान लेकिन समान नहीं, क्योंकि आपके पास बाईं और दाईं ओर तत्वों की असमान संख्या हो सकती है।
मार्क रैनसम

@MarkRansom यह एक उत्कृष्ट बिंदु है, मैंने इसे स्पष्ट करने के लिए अधिक जानकारी जोड़ी है।
केसी कुबाल

2
है a[:] = some_listके बराबर a = some_list[:]या a = some_list?
jadkik94

2
@ jadkik94 न तो। a[:] = some_listहोने का हर तत्व सेट करता aहै some_list। आपके द्वारा उल्लिखित दोनों में से किसी एक को करने से परिवर्तन होगा a। उदाहरण के लिए a = [1, 2, 3] b = a a[:] = [4, 5, 6] a is b:। अंतिम पंक्ति गलत होगी यदि इसे बदलने aके बजाय इसका मूल्य बदल गया।
केसी कुबाल

@ डार्थफेट दिलचस्प, मैंने अन्यथा पाया था :) धन्यवाद।
jadkik94

25

मैं पहले भी इसी सवाल पर आया था और यह भाषा विनिर्देश से संबंधित है। असाइनमेंट-स्टेटमेंट के अनुसार ,

  1. यदि असाइनमेंट के बाईं ओर सदस्यता है, तो पायथन __setitem__उस ऑब्जेक्ट पर कॉल करेगा । a[i] = xके बराबर है a.__setitem__(i, x)

  2. यदि असाइनमेंट के बाईं ओर स्लाइस है, तो पायथन भी कॉल करेगा __setitem__, लेकिन विभिन्न तर्कों के साथ: a[1:4]=[1,2,3]के बराबर है a.__setitem__(slice(1,4,None), [1,2,3])

इसीलिए '=' के बाईं ओर स्लाइस की सूची अलग तरह से व्यवहार करती है।


4

एक असाइनमेंट ऑपरेशन के बायीं तरफ स्लाइस करके, आप निर्दिष्ट कर रहे हैं कि कौन से आइटम को असाइन करना है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.