ฉันต้องการรู้ว่า + = ทำอะไรใน python มันง่ายมาก ฉันขอขอบคุณลิงก์ไปยังคำจำกัดความของเครื่องมือช่างสั้นอื่น ๆ ใน python
ฉันต้องการรู้ว่า + = ทำอะไรใน python มันง่ายมาก ฉันขอขอบคุณลิงก์ไปยังคำจำกัดความของเครื่องมือช่างสั้นอื่น ๆ ใน python
คำตอบ:
ใน 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
หวังว่านี่จะช่วยได้
__iadd__
ที่ส่งกลับประเภทอื่น (ซึ่งสามารถเพิ่มได้เอง)
+=
เพิ่มค่าอื่นด้วยค่าของตัวแปรและกำหนดค่าใหม่ให้กับตัวแปร
>>> x = 3
>>> x += 2
>>> print x
5
-=
, *=
, /=
ไม่คล้ายกันสำหรับการลบคูณหาร
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
+=
เพิ่มตัวเลขให้กับตัวแปรเปลี่ยนตัวแปรเองในกระบวนการ (ในขณะที่+
จะไม่ทำ) ในทำนองเดียวกันมีสิ่งต่อไปนี้ที่แก้ไขตัวแปรด้วย:
-=
ลบค่าออกจากตัวแปรตั้งค่าตัวแปรเป็นผลลัพธ์*=
คูณตัวแปรและค่าทำให้ผลลัพธ์เป็นตัวแปร/=
หารตัวแปรด้วยค่าทำให้ผลลัพธ์เป็นตัวแปร%=
ดำเนินการโมดูลัสกับตัวแปรโดยตัวแปรจะถูกกำหนดให้เป็นผลลัพธ์ของมันอาจจะมีคนอื่น ๆ ฉันไม่ใช่โปรแกรมเมอร์ Python
&=
, >>=
ฯลฯ ) และผู้ประกอบการทางคณิตศาสตร์เพิ่มเติม ( **=
อื่น ๆ )
เพิ่มตัวถูกดำเนินการด้านขวาไปทางซ้าย x += 2
วิธีx = x + 2
นอกจากนี้ยังสามารถเพิ่มองค์ประกอบในรายการ - ดูหัวข้อ SOนี้
ไม่ใช่เพียงทางลัดทางไวยากรณ์ ลองสิ่งนี้:
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ซึ่งทำสิ่งที่แตกต่างกับรายการ
สมมติว่า a + = b "เพิ่ม" b ให้กับการจัดเก็บผลลัพธ์ในไฟล์. คำอธิบายแบบง่ายนี้จะอธิบายตัวดำเนินการ + = ในหลายภาษา
อย่างไรก็ตามคำอธิบายที่เรียบง่ายทำให้เกิดคำถามสองสามข้อ
ใน 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] ใหม่ได้
คำตอบสั้น ๆ+=
สามารถแปลได้ว่า "เพิ่มสิ่งที่อยู่ทางขวาของ + = ให้กับตัวแปรทางด้านซ้ายของ + ="
อดีต ถ้าคุณมีa = 10
แล้วa += 5
จะ: a = a + 5
ดังนั้น "a" ตอนนี้เท่ากับ 15
หมายเหตุ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
+=
เป็นเพียงทางลัดสำหรับการเขียน
number = 4
number = number + 1
คุณจะเขียนแทน
numbers = 4
numbers += 1
ทั้งสองวิธีถูกต้อง แต่ตัวอย่างที่ 2 ช่วยให้คุณเขียนโค้ดน้อยลงเล็กน้อย
ตามที่คนอื่น ๆ กล่าวไว้ตัวดำเนินการ + = เป็นทางลัด ตัวอย่าง:
var = 1;
var = var + 1;
#var = 2
นอกจากนี้ยังสามารถเขียนได้ดังนี้:
var = 1;
var += 1;
#var = 2
ดังนั้นแทนที่จะเขียนตัวอย่างแรกคุณสามารถเขียนตัวอย่างที่สองซึ่งจะได้ผลดี
จำไว้ว่าเมื่อใดที่คุณใช้ในการหาผลรวมเช่น 2 และ 3 ในเครื่องคิดเลขเก่าของคุณและทุกครั้งที่คุณกดปุ่มที่=
คุณเห็น 3 ถูกบวกเข้าไปในผลรวมทั้งหมด+=
จะทำงานที่คล้ายกัน ตัวอย่าง:
>>> orange = 2
>>> orange += 3
>>> print(orange)
5
>>> orange +=3
>>> print(orange)
8
ฉันเห็นคำตอบมากมายที่ไม่ได้ใช้ + = กับจำนวนเต็ม
ตัวอย่างหนึ่ง:
x -= 1 + 3
สิ่งนี้จะคล้ายกับ:
x = x - (1 + 3)
และไม่:
x = (x - 1) + 3
ตามเอกสารประกอบ
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.
สังเกตว่ายังมี
object.__iadd__