2015-10-17 7 views
11

पायथन मानक लाइब्रेरी के profile.py पढ़ते समय मैं असाइनमेंट स्टेटमेंट sys.argv[:] = args पर आया, जिसका उपयोग प्रोग्राम को प्रोफाइल करने के लिए sys.argv को संशोधित करने के लिए किया जाता है, सही कमांड लाइन तर्क देखें। मैं समझता हूं कि यह वास्तविक परिचालनों में sys.argv = args[:] से अलग है, लेकिन प्रभाव में वे मेरे समान दिखते हैं। क्या कोई ऐसी स्थिति है जब कोई एक का उपयोग करना चाहता है, न कि दूसरे? और a[:] = b एक आम पायथन मुहावरे है?एक टुकड़ा से बनाम बनाम

अद्यतन: इस विशिष्ट स्थिति में एक दूसरे को क्यों चुनता है? (स्रोत profile.py की main समारोह में पाया जा सकता है)

उत्तर

9

अंतर नहीं है, तो इसका मतलब है जब आप a[:] = b का उपयोग आप को पार कर जाएगी जो कुछ a पर पहले से ही है। यदि आपके पास a के संदर्भ में कुछ और है तो यह भी बदलेगा, क्योंकि यह उसी स्थान का संदर्भ रखता है।

दूसरी ओर, a = b[:] एक नया संदर्भ बनाता है और b से सभी मानों को इस नए संदर्भ में कॉपी करता है। तो पुराने डेटा के मौजूदा संदर्भ पुराने डेटा को इंगित करते रहेंगे।

इस उदाहरण पर विचार:

>>> a = [1, 2, 3] 
>>> b = [4, 5, 6] 
>>> c = a # c is a reference to the list in a 
>>> c 
[1, 2, 3] 
>>> 
>>> a[:] = b 
>>> a # a will have a copy of the list in b 
[4, 5, 6] 
>>> C# and c will keep having the same value as a 
[4, 5, 6] 
>>> 
>>> b = [7, 8, 9] 
>>> a = b[:] 
>>> a # a has the new value 
[7, 8, 9] 
>>> C# c keeps having the old value 
[4, 5, 6] 
+0

धन्यवाद, मुझे एहसास हुआ कि यह एक फर्क अगर वहाँ 'A' –

+3

को अन्य संदर्भ एक उदाहरण देने के लिए उपयोगी हो सकता है कर रहे हैं बनाता है। यदि 'x = [1, 2, 3]', और 'a = x' (इसलिए वे एक ही सूची का संदर्भ देते हैं), 'ए = बी [:]' कर रहे हैं' b' की प्रति के साथ 'a' में _reference_ को बदलता है '; 'x' अपरिवर्तित है। दूसरी तरफ, 'a [:] = b' 'b' के मानों के साथ' a' (जिसका संदर्भ अपरिवर्तित है) के _contents_ को प्रतिस्थापित करता है, जिसका अर्थ है' x' भी संशोधित है; संदर्भ लिंक कभी टूटा नहीं गया था। – ShadowRanger

+0

मैंने अधिक जानकारी जोड़ने के लिए संपादित किया। लेकिन एक उदाहरण एक अच्छी बात होनी चाहिए। मैं इसे जोड़ दूंगा। –

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