क्या मतलब है?


95

मैं कुछ पायथन कोड का विश्लेषण कर रहा हूं और मुझे नहीं पता कि क्या है

pop = population[:]

माध्यम। क्या यह जावा में सरणी सूचियों की तरह है या द्वि-आयामी सरणी की तरह है?


1
संबंधित, एक सूची को साफ़ करना केवल डेल पॉप [:] या पॉप [:] = [] नहीं, pop.clear () .. (जैसा कि आप dicts के साथ करते हैं) करके संभव है।
मैके

पायथन स्लाइस की अच्छी SO चर्चा: stackoverflow.com/questions/509211/…
स्कॉट सी विल्सन

जवाबों:


109

यह स्लाइस अंकन का एक उदाहरण है, और यह क्या करता है के प्रकार पर निर्भर करता है population। यदि populationएक सूची है, तो यह रेखा सूची की उथली प्रति बनाएगी । एक प्रकार की वस्तु tupleया ए के लिए str, यह कुछ भी नहीं करेगा (लाइन बिना ऐसा ही करेगा [:]), और एक (कहना) न्यूम्पी सरणी के लिए, यह उसी डेटा के लिए एक नया दृश्य बनाएगा।


14
बस मामले में: टुकड़ा एक उथले प्रति देता है।
एंड्रे कारोन

4
@ हिलस: शायद l.copy()अधिक पठनीय है, लेकिन यह काम नहीं करेगा।
स्वेन मार्नाच

13
list(l)हमेशा काम करता है, अधिक पठनीय होता है, और कुछ के साथ एक प्रति भी वापस करने की गारंटी दी जाती हैnumpy.array
रोश ऑक्सीमोरोन

1
@ अली: हाँ, साथ में list.clear()। हालांकि, कुछ समय लगेगा, जब तक कि इससे एसओ पर इस तरह के प्रश्नों की महत्वपूर्ण कमी नहीं होगी। :)
स्वेन मार्नाच

1
@MichaelGraczyk: मुझे लगता है कि आप यहाँ NumPy सरणियों के बारे में बात कर रहे हैं। उपयोग करने के बजाय A[deque(chain((k,), repeat(slice(None), len(A.shape) - 1)).rotate(axis)], मैं लगभग हमेशा पसंद करता हूँ numpy.rollaxis(A, axis, 0)[k]। सामान्य तौर पर, मैं शायद ही कभी एक उपयोग के मामले में आया हूं जहां आपको सीधे slice()ऑब्जेक्ट बनाने की आवश्यकता होगी । यदि आप उन्हें किसी भी तरह की आवश्यकता है, तो NumPy s_उन्हें बनाने के लिए वैकल्पिक तरीके के रूप में सहायक प्रदान करता है।
स्वेन मार्नाच

27

यह जानने में भी मदद मिल सकती है कि सामान्य रूप से सूची का टुकड़ा सूची के भाग की प्रतिलिपि बनाता है। उदाहरण के population[2:4]लिए जनसंख्या [2] और जनसंख्या [3] (स्लाइसिंग राइट-एक्सक्लूसिव) वाली सूची वापस आ जाएगी। बाएं और दाएं सूचकांक को छोड़कर, जैसे population[:]वे क्रमशः 0 और लंबाई (जनसंख्या) के लिए डिफ़ॉल्ट होते हैं, जिससे पूरी सूची का चयन होता है। इसलिए सूची की एक प्रति बनाने के लिए यह एक सामान्य मुहावरा है।


15

अच्छा ... यह वास्तव में संदर्भ पर निर्भर करता है। अंततः, यह एक गुजरता sliceवस्तु ( slice(None,None,None): निम्न विधियों में से एक के लिए) __getitem__, __setitem__या __delitem__। (वास्तव में, यदि वस्तु में ए है __getslice__, जिसका उपयोग इसके बजाय किया जाएगा __getitem__, लेकिन वह अब हटा दिया गया है और इसका उपयोग नहीं किया जाना चाहिए)।

ऑब्जेक्ट वे कर सकते हैं जो वे स्लाइस के साथ चाहते हैं।

के संदर्भ में:

x = obj[:]

इसमें पास obj.__getitem__की गई स्लाइस ऑब्जेक्ट के साथ कॉल होगी । वास्तव में, यह पूरी तरह से इसके बराबर है:

x = obj[slice(None,None,None)]

(हालांकि पूर्व शायद अधिक कुशल है क्योंकि इसमें sliceकंस्ट्रक्टर को देखना नहीं है - यह सब बायटेकोड में किया गया है)।

अधिकांश वस्तुओं के लिए, यह अनुक्रम के एक हिस्से की उथली प्रतिलिपि बनाने का एक तरीका है।

आगे:

x[:] = obj

के __setitem__आधार पर आइटम सेट करने का एक तरीका है (इसे कॉल करता है ) obj

और, मुझे लगता है कि आप शायद अनुमान लगा सकते हैं:

del x[:]

कॉल ;-)

आप विभिन्न स्लाइस भी पास कर सकते हैं:

x[1:4]

निर्माणों slice(1,4,None)

x[::-1]

निर्माण slice(None,None,-1)और आगे। आगे पढ़े: पायथन के स्लाइस अंकन के बारे में बताएं


10

यह अनुक्रम की शुरुआत से अंत तक एक टुकड़ा है, आमतौर पर एक उथले प्रतिलिपि का उत्पादन होता है।

(ठीक है, यह इससे कहीं अधिक है , लेकिन आपको अभी तक देखभाल करने की आवश्यकता नहीं है।)


6

यह सूची की एक प्रति बनाता है, बनाम पहले से मौजूद सूची के लिए सिर्फ एक नया नाम निर्दिष्ट करता है।


5

[:]
सरणी में हैमिटर या स्लाइसिंग के लिए उपयोग किया जाता है, हैश
जैसे:
[१: ५] १ समावेशी और ५ अनन्य यानी १-४ के बीच मान प्रदर्शित करने के लिए
[शुरू: अंत]

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


1
इस तरह के एक पुराने प्रश्न को टक्कर देने का कोई कारण नहीं है जिसके पास पहले से ही 5 समान उत्तर हैं और यहां तक ​​कि एक स्वीकृत भी है ... इसके अलावा, a[1:5]तत्व 1-4 देता है, 2-4 नहीं।
स्केमह एक

@SkamahOne ओह मुझे नहीं पता। शायद इस मामले में नहीं, लेकिन ऐसे समय होते हैं, जहां मृत प्रश्न उठाने के लिए यह मूल्य हो सकता है। विभिन्न अंतर्दृष्टि, विभिन्न शब्दांकन आदि। इस मामले में आपने उत्तर को सही किया और उन्होंने उम्मीद की कि कुछ सीखा भी होगा।
प्रियरटन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.