+ = ทำอะไรใน python?


118

ฉันต้องการรู้ว่า + = ทำอะไรใน python มันง่ายมาก ฉันขอขอบคุณลิงก์ไปยังคำจำกัดความของเครื่องมือช่างสั้นอื่น ๆ ใน python



2
เป็นตัวดำเนินการพื้นฐานสำหรับ python (และภาษาอื่น ๆ อีกมากมายด้วย) คุณควรเริ่มต้นด้วย google หากคุณไม่เคยอ่านข้อมูลอ้างอิงของ python เลย
technomage

3
@AndiDog แม้ว่าคำถามทั้งสองจะเป็นความจริงเกี่ยวกับตัวดำเนินการ (+ =) คำถามที่คุณเชื่อมโยงนั้นเกี่ยวกับการใช้งานที่ซับซ้อนและปัญหาที่ละเอียดอ่อนและ OP ที่นี่อาจไม่สามารถทำตามเหตุผลที่นั่นได้ (ยัง)
ดร. belisarius

3
@AndiDog บางทีคุณอาจคิดถูกในเวลานั้น แต่เมื่อมองไปที่วิธีแก้ปัญหา (เกือบ) ที่ยอมรับได้ที่นี่เป็นที่ชัดเจนว่าคำถามนี้เกี่ยวกับความเข้าใจพื้นฐานของตัวดำเนินการ: D
Dr. belisarius

1
ส่วนใหญ่ใช้ sumbol การจัดทำดัชนีในขณะนี้ในหน้าสัญลักษณ์docs.python.org/3/genindex-Symbols.html
Terry Jan Reedy

คำตอบ:


149

ใน Python + = คือการเคลือบน้ำตาลสำหรับ__iadd__วิธีพิเศษ__add__หรือ__radd__ถ้า__iadd__ไม่มีอยู่ __iadd__วิธีการของชั้นสามารถทำอะไรที่มันต้องการ อ็อบเจ็กต์รายการจะใช้มันและใช้เพื่อทำซ้ำบนอ็อบเจ็กต์ที่ทำซ้ำได้โดยผนวกแต่ละองค์ประกอบเข้ากับตัวมันเองในลักษณะเดียวกับที่วิธีการขยายรายการทำ

นี่คือคลาสแบบกำหนดเองง่ายๆที่ใช้__iadd__เมธอดพิเศษ คุณเริ่มต้นวัตถุด้วย int จากนั้นสามารถใช้ตัวดำเนินการ + = เพื่อเพิ่มตัวเลข ฉันได้เพิ่มคำสั่งพิมพ์__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 สำหรับคำตอบที่แท้จริง =)
Michael

@ Michael นั่นคือสิ่งที่อารมณ์ขันเพิ่มความจริง ... :-D
Aaron John Sabu

3
+1 สำหรับการตอบคำถาม แต่ -1 สำหรับ an __iadd__ที่ส่งกลับประเภทอื่น (ซึ่งสามารถเพิ่มได้เอง)
Caleth

คำตอบนี้ซับซ้อนเกินไปสำหรับประเภทของบุคคลที่ต้องการถามว่า + = หมายถึงอะไร (เช่นผู้เริ่มต้น) คำตอบของคุณไม่ใช่คำตอบสำหรับผู้เริ่มต้นไม่ใช่เพียงเพราะผู้เริ่มต้นมักจะไม่ได้เริ่มเรียนรู้ Python ด้วยวิธีเชิงวัตถุ แต่ยังเป็นเพราะมีคำตอบที่ง่ายกว่ามาก (เช่น @ Imran ด้านล่าง) แค่สองเซ็นต์ของฉันแม้ว่าฉันจะซาบซึ้งกับคำตอบนี้
q-compute

129

+= เพิ่มค่าอื่นด้วยค่าของตัวแปรและกำหนดค่าใหม่ให้กับตัวแปร

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

-=, *=, /=ไม่คล้ายกันสำหรับการลบคูณหาร


19
"ตัวมันเอง" เป็นคำอธิบายที่แย่มากที่นี่เนื่องจากจำนวนเต็มไม่เปลี่ยนรูป
AndiDog

41

x += 5ไม่เหมือนกับที่พูดx = x + 5ใน Python

หมายเหตุที่นี่:

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
ยูเอฟโอ

นอกจากนี้หนึ่งในเธรดที่เชื่อมโยงยังมีการอภิปรายที่ดีว่ามันแตกต่างกันตรงไหน stackoverflow.com/questions/6951792/...
ยูเอฟโอ

31

+=เพิ่มตัวเลขให้กับตัวแปรเปลี่ยนตัวแปรเองในกระบวนการ (ในขณะที่+จะไม่ทำ) ในทำนองเดียวกันมีสิ่งต่อไปนี้ที่แก้ไขตัวแปรด้วย:

  • -=ลบค่าออกจากตัวแปรตั้งค่าตัวแปรเป็นผลลัพธ์
  • *=คูณตัวแปรและค่าทำให้ผลลัพธ์เป็นตัวแปร
  • /=หารตัวแปรด้วยค่าทำให้ผลลัพธ์เป็นตัวแปร
  • %=ดำเนินการโมดูลัสกับตัวแปรโดยตัวแปรจะถูกกำหนดให้เป็นผลลัพธ์ของมัน

อาจจะมีคนอื่น ๆ ฉันไม่ใช่โปรแกรมเมอร์ Python


2
สำหรับตัวเลขคำตอบนี้ถูกต้อง (ดูคำตอบของไบรอันสำหรับพฤติกรรมพิเศษ.) มีแน่นอนคนอื่น ๆ หลายคนรวมทั้งผู้ประกอบการระดับบิต ( &=, >>=ฯลฯ ) และผู้ประกอบการทางคณิตศาสตร์เพิ่มเติม ( **=อื่น ๆ )
Michael

16

เพิ่มตัวถูกดำเนินการด้านขวาไปทางซ้าย x += 2วิธีx = x + 2

นอกจากนี้ยังสามารถเพิ่มองค์ประกอบในรายการ - ดูหัวข้อ SOนี้


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 list แต่ + เรียกใช้addซึ่งทำสิ่งที่แตกต่างกับรายการ


7

สมมติว่า a + = b "เพิ่ม" b ให้กับการจัดเก็บผลลัพธ์ในไฟล์. คำอธิบายแบบง่ายนี้จะอธิบายตัวดำเนินการ + = ในหลายภาษา

อย่างไรก็ตามคำอธิบายที่เรียบง่ายทำให้เกิดคำถามสองสามข้อ

  1. คำว่า "เพิ่ม" หมายถึงอะไรกันแน่?
  2. "การจัดเก็บผลลัพธ์ใน a" หมายความว่าอย่างไร ตัวแปร python ไม่เก็บค่าโดยตรงที่เก็บการอ้างอิงถึงวัตถุ

ใน python คำตอบของคำถามทั้งสองนี้ขึ้นอยู่กับชนิดข้อมูลของไฟล์.


แล้วการ "เพิ่ม" หมายความว่าอย่างไร?

  • สำหรับตัวเลขหมายถึงการบวกตัวเลข
  • สำหรับรายการสิ่งที่เพิ่มขึ้นสตริง ฯลฯ หมายถึงการต่อกัน

โปรดทราบว่าสำหรับรายการ + = มีความยืดหยุ่นมากกว่า + ตัวดำเนินการ + ในรายการต้องการรายการอื่น แต่ตัวดำเนินการ + = จะยอมรับการทำซ้ำใด ๆ


แล้ว "การจัดเก็บค่าเป็น" หมายความว่าอย่างไร?

หากออบเจ็กต์นั้นไม่แน่นอนขอแนะนำให้ (แต่ไม่จำเป็น) เพื่อทำการแก้ไขในสถานที่ ดังนั้นชี้ไปที่วัตถุเดียวกันกับที่เคยทำมาก่อน แต่ตอนนี้วัตถุนั้นมีเนื้อหาที่แตกต่างกัน

หากวัตถุไม่เปลี่ยนรูปก็เห็นได้ชัดว่าไม่สามารถทำการแก้ไขในสถานที่ได้ วัตถุที่เปลี่ยนแปลงไม่ได้บางอย่างอาจไม่มีการใช้งานการดำเนินการ "เพิ่ม" แบบแทนที่ ในกรณีนี้ตัวแปร "a" จะถูกอัปเดตให้ชี้ไปที่วัตถุใหม่ที่มีผลลัพธ์ของการดำเนินการเพิ่มเติม

เทคนิคนี้จะดำเนินการโดยการมองหา__IADD__แรกหากที่ไม่ได้ดำเนินการแล้วจะพยายามและในที่สุด__ADD____RADD__


จำเป็นต้องใช้ความระมัดระวังเมื่อใช้ + = ใน python กับตัวแปรที่เราไม่แน่ใจประเภทที่แน่นอนและโดยเฉพาะอย่างยิ่งในกรณีที่เราไม่แน่ใจว่าประเภทนั้นเปลี่ยนแปลงได้หรือไม่ ตัวอย่างเช่นพิจารณารหัสต่อไปนี้

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

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

เมื่อเราเรียกใช้ dostuff ด้วยทูเปิลทูเปิลจะถูกคัดลอกเป็นส่วนหนึ่งของการดำเนินการ + = ดังนั้น b จึงไม่ได้รับผลกระทบ อย่างไรก็ตามเมื่อเราเรียกใช้ด้วยรายการรายการจะถูกแก้ไขดังนั้นทั้ง a และ b จึงได้รับผลกระทบ

ใน python 3 จะพบพฤติกรรมที่คล้ายกันกับประเภท "bytes" และ "bytearray"


สุดท้ายโปรดทราบว่าการมอบหมายใหม่จะเกิดขึ้นแม้ว่าวัตถุจะไม่ถูกแทนที่ก็ตาม สิ่งนี้ไม่สำคัญมากนักหากด้านซ้ายมือเป็นเพียงตัวแปร แต่อาจทำให้เกิดพฤติกรรมที่สับสนเมื่อคุณมีคอลเล็กชันที่ไม่เปลี่ยนรูปซึ่งอ้างถึงคอลเล็กชันที่เปลี่ยนแปลงได้เช่น

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

ในกรณีนี้ [5] จะถูกเพิ่มเข้าไปในรายการที่อ้างถึงโดย [0] ได้สำเร็จ แต่หลังจากนั้นจะมีการเพิ่มข้อยกเว้นเมื่อรหัสพยายามและไม่สามารถกำหนด [0] ใหม่ได้


5

คำตอบสั้น ๆ+=สามารถแปลได้ว่า "เพิ่มสิ่งที่อยู่ทางขวาของ + = ให้กับตัวแปรทางด้านซ้ายของ + ="

อดีต ถ้าคุณมีa = 10แล้วa += 5จะ: a = a + 5

ดังนั้น "a" ตอนนี้เท่ากับ 15


คำตอบนี้มีส่วนช่วยอะไรที่ยังไม่ได้พูดคุยกัน เป็นคำตอบที่ซ้ำกัน ...

jdv แค่พยายามช่วย ฉันเป็นผู้ให้ข้อมูลใหม่ขออภัยหากคุณคิดว่าคำตอบของฉันซ้ำกัน

ชัดเจนว่ามันซ้ำกันหากคุณดูคำตอบอื่น ๆ ส่วนใหญ่ เป็นเรื่องดีที่จะมีส่วนร่วม แต่คุณควรพยายามมีส่วนร่วมในสิ่งใหม่ ๆ (เช่นเช่นคำตอบ add vs iadd) หรือคุณต้องการหาวิธีแก้ปัญหาที่ชัดเจนกว่า แต่เท่าที่ฉันสามารถบอกได้คำตอบที่ได้รับการโหวตสูงสุดนั้นชัดเจนที่สุดเท่าที่คุณจะหาได้สำหรับคำตอบพื้นฐาน

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

ทั้งสองวิธีถูกต้อง แต่ตัวอย่างที่ 2 ช่วยให้คุณเขียนโค้ดน้อยลงเล็กน้อย


1
พฤติกรรมเหมือนกันกับตัวเลข แต่ไม่เหมือนกันโดยทั่วไป
plugwash

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 += 3x = x + 3

x = 2

x += 3

print(x)

จะส่งออก 5.

สังเกตว่ายังมี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.