अजगर में वास्तव में + क्या करता है?


118

मुझे यह जानने की जरूरत है कि अजगर में + क्या करता है। यह इत्ना आसान है। मैं अजगर में अन्य लघु हाथ उपकरणों की परिभाषाओं के लिंक की भी सराहना करूंगा।



2
यह अजगर (और कई अन्य भाषाओं में भी) के लिए एक मूल ऑपरेटर है, आपको Google से शुरू करना चाहिए, अगर आपने कभी भी अजगर के संदर्भ को नहीं पढ़ा है।
टेक्नोमेज

3
@AndiDog, हालांकि यह सच है कि दोनों प्रश्न (+ =) ऑपरेटर के बारे में हैं, जो आप जुड़ा है वह एक परिष्कृत उपयोग और सूक्ष्म समस्या के बारे में है, और यहाँ ओपी शायद (अभी तक) तर्क का पालन करने में सक्षम नहीं है।
डॉ। बेलीजरियस

3
@AndiDog शायद आप उस समय सही थे, लेकिन यहाँ (लगभग) स्वीकृत समाधानों को देखते हुए, यह स्पष्ट है कि यह प्रश्न ऑपरेटर की एक बुनियादी समझ के बारे में है: D
डॉ। बिसरिसेर

1
अधिकांश sumbol का उपयोग अब सिंबल पेज docs.python.org/3/genindex-Symbols.html में किया जाता है
टेरी जान कॉमेडी

जवाबों:


148

पायथन में, + = __iadd__विशेष विधि के लिए चीनी कोटिंग है , __add__या __radd__यदि __iadd__मौजूद नहीं है। __iadd__एक वर्ग की विधि वह कुछ भी कर सकती है जो वह चाहती है। सूची ऑब्जेक्ट इसे लागू करता है और इसका उपयोग एक पुनरावृत्त वस्तु पर पुनरावृति करने के लिए करता है जो प्रत्येक तत्व को उसी तरह से जोड़ते हैं जिस तरह से सूची का विस्तार विधि करता है।

यहां एक सरल कस्टम वर्ग है जो __iadd__विशेष विधि को लागू करता है । आप ऑब्जेक्ट को एक इंट के साथ इनिशियलाइज़ करते हैं, फिर नंबर जोड़ने के लिए + = ऑपरेटर का उपयोग कर सकते हैं। मैंने __iadd__यह दिखाने के लिए एक प्रिंट स्टेटमेंट जोड़ा है कि उसे कॉल किया जाता है। साथ ही, __iadd__किसी वस्तु को वापस करने की उम्मीद की जाती है, इसलिए मैंने खुद को जोड़ दिया और दूसरी संख्या को जोड़ दिया जो इस मामले में समझ में आता है।

>>> class Adder(object):
        def __init__(self, num=0):
            self.num = num

        def __iadd__(self, other):
            print 'in __iadd__', other
            self.num = self.num + other
            return self.num

>>> a = Adder(2)
>>> a += 3
in __iadd__ 3
>>> a
5

उम्मीद है की यह मदद करेगा।


24
हालांकि यह वह नहीं है जो पूछने वाले को असली जवाब के लिए +1 की तलाश थी। =)
माइकल

@ मिचेल, वह जगह है जहाँ हास्य तथ्य में जोड़ता है ...:
हारून जॉन साबू

3
+1 प्रश्न का उत्तर देने के लिए, लेकिन -1 के लिए __iadd__एक अलग प्रकार (जो स्वयं योग करने योग्य है)
लौटाता है

यह उत्तर उस व्यक्ति के प्रकार के लिए बहुत जटिल है जिसे यह पूछने की आवश्यकता है कि क्या + = का अर्थ है (अर्थात, एक शुरुआत)। आपका उत्तर एक शुरुआती उत्तर नहीं है, सिर्फ इसलिए नहीं कि आमतौर पर शुरुआती लोग ऑब्जेक्ट-ओरिएंटेड तरीके से अजगर सीखना शुरू नहीं करते हैं, बल्कि इसलिए भी कि बहुत सरल उत्तर हैं (जैसे @ इमरान के नीचे)। बस मेरे दो सेंट, भले ही मैं इस जवाब की सराहना करता हूं।
क्यू-गणना

129

+= चर के मूल्य के साथ एक और मूल्य जोड़ता है और चर को नया मूल्य प्रदान करता है।

>>> x = 3
>>> x += 2
>>> print x
5

-=, *=, /=घटाव, गुणा और भाग के लिए इसी तरह की है।


19
"स्वयं" वास्तव में यहाँ एक बहुत बुरा वर्णन है, क्योंकि पूर्णांक अपरिवर्तनीय हैं।
एंडीडॉग

41

x += 5x = x + 5पायथन में कहने जैसा बिल्कुल नहीं है ।

यहाँ ध्यान दें:

In [1]: x = [2,3,4]    
In [2]: y = x    
In [3]: x += 7,8,9    
In [4]: x
Out[4]: [2, 3, 4, 7, 8, 9]    
In [5]: y
Out[5]: [2, 3, 4, 7, 8, 9]    
In [6]: x += [44,55]    
In [7]: x
Out[7]: [2, 3, 4, 7, 8, 9, 44, 55]    
In [8]: y
Out[8]: [2, 3, 4, 7, 8, 9, 44, 55]    
In [9]: x = x + [33,22]    
In [10]: x
Out[10]: [2, 3, 4, 7, 8, 9, 44, 55, 33, 22]    
In [11]: y
Out[11]: [2, 3, 4, 7, 8, 9, 44, 55]

संदर्भ के लिए देखें: सूचियों पर अप्रत्याशित रूप से व्यवहार क्यों होता है?


यह एक ही है, हालांकि, अजीब मामले को छोड़करx += 7,8,9
Ufos

इसके अलावा, लिंक किए गए थ्रेड्स में से एक अच्छी चर्चा प्रदान करता है कि वास्तव में यह कहां भिन्न है। stackoverflow.com/questions/6951792/…
Ufos

31

+=चर में एक संख्या जोड़ता है, चर को प्रक्रिया में बदल देता है (जबकि +ऐसा नहीं होगा)। इसके समान, निम्नलिखित भी हैं जो चर को संशोधित करते हैं:

  • -=, चर से एक मूल्य घटाता है, चर को परिणाम पर सेट करता है
  • *=, चर और एक मूल्य को गुणा करता है, जिससे परिणाम चर होता है
  • /=, चर को मूल्य से विभाजित करता है, जिससे परिणाम चर बन जाता है
  • %=, चर पर मापांक करता है, चर के साथ फिर इसके परिणाम पर सेट किया जाता है

और भी हो सकते हैं। मैं पायथन प्रोग्रामर नहीं हूं।


2
संख्याओं के लिए, यह उत्तर सही है। (देखें ब्रायन का जवाब विशेष व्यवहार के लिए।) वहाँ वास्तव में कर रहे कई अन्य लोगों, बिटवाइज़ ऑपरेटर्स (सहित &=, >>=, आदि) और अतिरिक्त गणित ऑपरेटरों ( **=, आदि)।
माइकल 12


15

यह एक मात्र वाक्य्यात्मक शॉर्टकट नहीं है। इसे इस्तेमाल करे:

x=[]                   # empty list
x += "something"       # iterates over the string and appends to list
print(x)               # ['s', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g']

बनाम

x=[]                   # empty list
x = x + "something"    # TypeError: can only concatenate list (not "str") to list

यह दिखाता है कि + = iadd सूची विधि को आमंत्रित करता है लेकिन + चालान जोड़ता है , जो सूचियों के साथ अलग-अलग काम करते हैं।


7

विशेष रूप से a + = b "a" परिणाम को स्टोर करने के लिए "b" जोड़ता है। यह सरलीकृत वर्णन कई भाषाओं में + = ऑपरेटर का वर्णन करेगा।

हालाँकि सरलीकृत वर्णन कुछ सवालों को उठाता है।

  1. "जोड़ने" से हमारा वास्तव में क्या मतलब है?
  2. "परिणाम को एक में संग्रहीत करने" से हमारा वास्तव में क्या मतलब है? अजगर चर मूल्यों को सीधे स्टोर नहीं करते हैं वे वस्तुओं के संदर्भ में संग्रहीत करते हैं।

अजगर में इन दोनों सवालों के जवाब डेटा के प्रकार पर निर्भर करते हैं।


तो वास्तव में "जोड़ने" का क्या मतलब है?

  • संख्याओं के लिए इसका अर्थ है संख्यात्मक जोड़।
  • सूचियों, टुपल्स, स्ट्रिंग्स आदि के लिए इसका अर्थ है समवर्ती।

ध्यान दें कि सूचियों के लिए + = की तुलना में अधिक लचीला है, एक सूची में + ऑपरेटर को दूसरी सूची की आवश्यकता होती है, लेकिन + = ऑपरेटर किसी भी स्वीकार्य को स्वीकार करेगा।


तो क्या करता है "एक मतलब में मूल्य भंडारण"?

यदि ऑब्जेक्ट उत्परिवर्तनीय है, तो इसे जगह में संशोधन करने के लिए प्रोत्साहित किया जाता है (लेकिन आवश्यक नहीं)। तो उसी वस्तु के लिए एक अंक जो उसने पहले किया था लेकिन उस वस्तु में अब अलग सामग्री है।

यदि ऑब्जेक्ट अपरिवर्तनीय है, तो यह स्पष्ट रूप से संशोधन को अंदर नहीं कर सकता है। कुछ उत्परिवर्तनीय वस्तुओं में इन-प्लेस "ऐड" ऑपरेशन का कार्यान्वयन नहीं हो सकता है। इस मामले में परिवर्ती "a" को एक नई वस्तु के लिए इंगित किया जाएगा जिसमें एक अतिरिक्त ऑपरेशन का परिणाम होगा।

तकनीकी रूप से इसे __IADD__पहले की तलाश में लागू किया जाता है , यदि इसे लागू नहीं किया जाता है तो __ADD__कोशिश की जाती है और अंत में __RADD__


चर पर अजगर में + = का उपयोग करते समय देखभाल की आवश्यकता होती है, जहां हम सटीक प्रकार के बारे में निश्चित नहीं हैं और विशेष रूप से जहां हम निश्चित नहीं हैं कि क्या प्रकार परिवर्तनशील है या नहीं। उदाहरण के लिए निम्नलिखित कोड पर विचार करें।

def dostuff(a):
    b = a
    a += (3,4)
    print(repr(a)+' '+repr(b))

dostuff((1,2))
dostuff([1,2])

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

अजगर 3 में, "बाइट्स" और "बायट्रेयर" प्रकारों के साथ समान व्यवहार देखा जाता है।


अंत में ध्यान दें कि वस्तु को प्रतिस्थापित न करने पर भी पुनर्मूल्यांकन होता है। यह ज्यादा मायने नहीं रखता है अगर बाएं हाथ की तरफ केवल एक चर है लेकिन यह भ्रामक व्यवहार का कारण बन सकता है जब आपके पास एक अपरिवर्तनीय संग्रह है जो उदाहरण के लिए उत्परिवर्तित संग्रह का संदर्भ देता है:

a = ([1,2],[3,4])
a[0] += [5]

इस मामले में [५] को एक [०] द्वारा निर्दिष्ट सूची में सफलतापूर्वक जोड़ा जाएगा, लेकिन बाद में एक अपवाद उठाया जाएगा जब कोड कोशिश करता है और एक [०] को आश्वस्त करने में विफल रहता है।


5

संक्षिप्त उत्तर का +=अनुवाद "+ = के बाईं ओर चर में + = के दाईं ओर जो कुछ भी है उसे जोड़ें" के रूप में किया जा सकता है।

पूर्व। यदि आपके पास है a = 10तो a += 5होगा: a = a + 5

तो, "ए" अब 15 के बराबर है।


इस उत्तर का क्या योगदान है जो पहले से ही चर्चा में नहीं है? इसका डुप्लीकेट उत्तर है ...

jdv, बस मदद करने की कोशिश कर रहा है। मैं एक नया योगदानकर्ता हूं, इसलिए यदि आपको लगता है कि मेरा उत्तर डुप्लिकेट था, तो क्षमा करें।

यह स्पष्ट है कि यदि आप अन्य उत्तरों में से अधिकांश को देखते हैं तो यह एक डुप्लिकेट है। योगदान करना ठीक है, लेकिन आपको कुछ नया योगदान देने के लिए प्रयास करना चाहिए (जैसे, ऐड बनाम आईडीडी उत्तर) या आप एक स्पष्ट समाधान पर एक स्टैब लेना चाहते हैं। लेकिन, जहां तक ​​मैं बता सकता हूं, शीर्ष-वोट किए गए उत्तर लगभग स्पष्ट हैं, क्योंकि आप एक मूल उत्तर के लिए प्राप्त कर सकते हैं।

4

नोट कुछ स्थितियों में x += yसमान नहीं है, x = x + yजहां ऑपरेटर की पूर्वता के कारण एक अतिरिक्त ऑपरेटर को शामिल किया जाता है, इस तथ्य के साथ कि दाहिने हाथ की ओर हमेशा पहले मूल्यांकन किया जाता है, जैसे।

>>> x = 2
>>> x += 2 and 1
>>> x
3

>>> x = 2
>>> x = x + 2 and 1
>>> x
1

ध्यान दें कि पहले मामले का विस्तार:

>>> x = 2
>>> x = x + (2 and 1)
>>> x
3

आपको अन्य ऑपरेटरों के साथ 'वास्तविक दुनिया' में इसका सामना करने की अधिक संभावना है, जैसे

x *= 2 + 1== x = x * (2 + 1)! =x = x * 2 + 1


4

+= लिखने के लिए सिर्फ एक शॉर्टकट है

number = 4
number = number + 1

तो इसके बजाय आप लिखेंगे

numbers = 4
numbers += 1

दोनों तरीके सही हैं लेकिन उदाहरण दो आपको थोड़ा कम कोड लिखने में मदद करते हैं


1
व्यवहार संख्याओं पर समान है लेकिन यह सामान्य रूप में समान नहीं है।
प्लगवॉश

0

जैसा कि दूसरों ने भी कहा, + = ऑपरेटर एक शॉर्टकट है। एक उदाहरण:

var = 1;
var = var + 1;
#var = 2

यह भी लिखा जा सकता है:

var = 1;
var += 1;
#var = 2

इसलिए पहला उदाहरण लिखने के बजाय, आप सिर्फ दूसरा लिख ​​सकते हैं, जो ठीक काम करेगा।


0

याद रखें जब आप योग करते थे, उदाहरण के लिए 2 और 3, अपने पुराने कैलकुलेटर में और हर बार जब आप हिट करते हैं =तो आप कुल मिलाकर 3 जोड़ते हैं, +=समान कार्य करता है। उदाहरण:

>>> orange = 2
>>> orange += 3
>>> print(orange)
5
>>> orange +=3
>>> print(orange)
8

0

मैं बहुत सारे उत्तर देख रहा हूं जो कई पूर्णांक के साथ + = का उपयोग नहीं करते हैं।

एक उदाहरण:

x -= 1 + 3

यह इस तरह होगा:

x = x - (1 + 3)

और नहीं:

x = (x - 1) + 3

0

प्रलेखन के अनुसार

x += yके बराबर है x = operator.iadd(x, y)। इसे कहने का एक और तरीका यह है कि z = operator.iadd(x, y)यह यौगिक कथन के बराबर है z = x; z += y

तो x += 3जैसा है वैसा ही है x = x + 3

x = 2

x += 3

print(x)

आउटपुट 5 होगा।

ध्यान दें कि वहाँ भी है

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