Chính xác thì + = làm gì trong python?


118

Tôi cần biết + = làm gì trong python. Nó đơn giản mà. Tôi cũng đánh giá cao các liên kết đến định nghĩa của các dụng cụ cầm tay ngắn khác trong python.



2
đó là một toán tử cơ bản cho python (và nhiều ngôn ngữ khác nữa), bạn nên bắt đầu với google, nếu bạn chưa bao giờ đọc bất kỳ tài liệu tham khảo nào về python.
technomage

3
@AndiDog Mặc dù cả hai câu hỏi đều đúng về toán tử (+ =), nhưng câu hỏi mà bạn đã liên kết là về một cách sử dụng phức tạp và một vấn đề phức tạp, và OP ở đây có thể không tuân theo lý luận ở đó (chưa).
Tiến sĩ belisarius

3
@AndiDog Có lẽ bạn đã đúng vào thời điểm đó, nhưng nhìn vào các giải pháp (hầu như) được chấp nhận ở đây, rõ ràng là câu hỏi này là về một sự hiểu biết cơ bản của các nhà điều hành: D
Tiến sĩ Belisarius

1
Hầu hết việc sử dụng sumbol hiện đã được lập chỉ mục trong trang Biểu tượng docs.python.org/3/genindex-Symbols.html .
Terry Jan Reedy

Câu trả lời:


148

Trong Python, + = là lớp phủ đường cho __iadd__phương pháp đặc biệt hoặc __add__hoặc __radd__nếu __iadd__không có. Các __iadd__phương pháp của một lớp có thể làm bất cứ điều gì nó muốn. Đối tượng danh sách thực hiện nó và sử dụng nó để lặp qua một đối tượng có thể lặp lại nối từng phần tử vào chính nó theo cách giống như phương thức mở rộng của danh sách.

Đây là một lớp tùy chỉnh đơn giản triển khai __iadd__phương thức đặc biệt. Bạn khởi tạo đối tượng bằng một int, sau đó có thể sử dụng toán tử + = để thêm một số. Tôi đã thêm một câu lệnh in __iadd__để hiển thị rằng nó được gọi. Ngoài ra, __iadd__dự kiến ​​sẽ trả về một đối tượng, vì vậy tôi đã trả lại phần cộng của chính nó cộng với số khác có ý nghĩa trong trường hợp này.

>>> 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

Hi vọng điêu nay co ich.


24
Mặc dù đây không phải là những gì Người hỏi đang tìm kiếm, hãy +1 cho câu trả lời thực sự. =)
Michael

@ Michael, đó là nơi hài hước thêm vào thực tế ... :-D
Aaron John Sabu

3
1 cho việc trả lời các câu hỏi, nhưng -1 cho một __iadd__trả về một kiểu khác nhau (mà chính nó là thích nghi được)
Caleth

Câu trả lời này quá phức tạp đối với kiểu người cần hỏi + = nghĩa là gì (tức là người mới bắt đầu). Câu trả lời của bạn không phải là câu trả lời cho người mới bắt đầu, không chỉ vì người mới bắt đầu thường không bắt đầu học Python theo hướng đối tượng, mà còn bởi vì có những câu trả lời đơn giản hơn nhiều (như @ Imran bên dưới). Chỉ hai xu của tôi, mặc dù tôi đánh giá cao câu trả lời này.
q-compute

129

+= thêm giá trị khác với giá trị của biến và gán giá trị mới cho biến.

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

-=, *=, /=Làm tương tự cho phép trừ, nhân và chia.


19
"chính nó" thực sự là một mô tả rất tệ ở đây, vì các số nguyên là bất biến.
AndiDog

41

x += 5không hoàn toàn giống như nói x = x + 5bằng Python.

Lưu ý ở đây:

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]

Xem để tham khảo: Tại sao + = hoạt động bất ngờ trên danh sách?


nó là như nhau, tuy nhiên, trừ trường hợp kỳ lạx += 7,8,9
UFO

Ngoài ra, một trong những chủ đề được liên kết cung cấp một cuộc thảo luận tốt về nơi chính xác nó khác nhau. stackoverflow.com/questions/6951792/…
Ufos

31

+=thêm một số vào một biến, thay đổi chính biến đó trong quá trình này (ngược lại +thì không). Tương tự như điều này, có những điều sau đây cũng sửa đổi biến:

  • -=, trừ một giá trị khỏi biến, đặt biến thành kết quả
  • *=, nhân biến và một giá trị, làm cho kết quả là biến
  • /=, chia biến cho giá trị, làm cho kết quả là biến
  • %=, thực hiện mô đun trên biến, với biến sau đó được đặt thành kết quả của nó

Có thể có những người khác. Tôi không phải là một lập trình viên Python.


2
Đối với các con số, câu trả lời này là chính xác. (Xem câu trả lời Bryan cho hành vi đặc biệt.) Có thực sự là một số người khác, bao gồm cả các nhà khai thác Bitwise ( &=, >>=, vv) và các nhà khai thác toán bổ sung ( **=, vv).
Michael


15

Nó không phải là một lối tắt cú pháp đơn thuần. Thử cái này:

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

đấu với

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

Điều này minh họa rằng + = gọi phương thức iadd list nhưng + gọi thêm , thực hiện những việc khác với danh sách.


7

Theo tùy chọn a + = b "thêm" b vào a lưu trữ kết quả trong a. Mô tả đơn giản này sẽ mô tả toán tử + = trong nhiều ngôn ngữ.

Tuy nhiên, mô tả đơn giản đặt ra một số câu hỏi.

  1. Chính xác thì chúng ta có nghĩa là gì khi "thêm"?
  2. Chính xác thì chúng ta có nghĩa là gì khi "lưu trữ kết quả trong một"? Các biến python không lưu trữ trực tiếp các giá trị mà chúng lưu trữ các tham chiếu đến các đối tượng.

Trong python, câu trả lời cho cả hai câu hỏi này phụ thuộc vào kiểu dữ liệu của a.


Vậy chính xác thì "thêm" nghĩa là gì?

  • Đối với số nó có nghĩa là cộng số.
  • Đối với danh sách, bộ giá trị, chuỗi, v.v. nó có nghĩa là nối.

Lưu ý rằng đối với danh sách + = linh hoạt hơn +, toán tử + trên danh sách yêu cầu một danh sách khác, nhưng toán tử + = sẽ chấp nhận bất kỳ phép lặp nào.


Vậy "lưu trữ giá trị trong một" nghĩa là gì?

Nếu đối tượng có thể thay đổi thì nó được khuyến khích (nhưng không bắt buộc) thực hiện sửa đổi tại chỗ. Vì vậy, một trỏ đến cùng một đối tượng nó đã làm trước đây nhưng đối tượng đó bây giờ có nội dung khác nhau.

Nếu đối tượng là bất biến thì rõ ràng nó không thể thực hiện sửa đổi tại chỗ. Một số đối tượng có thể thay đổi cũng có thể không có hoạt động "thêm" tại chỗ. Trong trường hợp này, biến "a" sẽ được cập nhật để trỏ đến một đối tượng mới chứa kết quả của một phép toán cộng.

Về mặt kỹ thuật, điều này được thực hiện bằng cách tìm kiếm __IADD__trước, nếu điều đó không được thực hiện thì __ADD__thử và cuối cùng __RADD__.


Cần phải cẩn thận khi sử dụng + = trong python trên các biến mà chúng tôi không chắc chắn về kiểu chính xác và đặc biệt là khi chúng tôi không chắc liệu kiểu có thể thay đổi hay không. Ví dụ, hãy xem xét đoạn mã sau.

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

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

Khi chúng ta gọi dostuff với một tuple thì tuple được sao chép như một phần của phép toán + = và do đó b không bị ảnh hưởng. Tuy nhiên, khi chúng ta gọi nó với một danh sách, danh sách được sửa đổi tại chỗ, vì vậy cả a và b đều bị ảnh hưởng.

Trong python 3, hành vi tương tự cũng được quan sát với các loại "byte" và "bytearray".


Cuối cùng lưu ý rằng việc gán lại xảy ra ngay cả khi đối tượng không được thay thế. Điều này không quan trọng lắm nếu phía bên trái chỉ đơn giản là một biến nhưng nó có thể gây ra hành vi khó hiểu khi bạn có một tập hợp bất biến đề cập đến các tập hợp có thể thay đổi, ví dụ:

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

Trong trường hợp này, [5] sẽ được thêm thành công vào danh sách được tham chiếu bởi [0] nhưng sau đó một ngoại lệ sẽ xuất hiện khi mã cố gắng và không thể gán lại [0].


5

Câu trả lời ngắn gọn là +=có thể được dịch là "thêm bất cứ thứ gì ở bên phải dấu + = vào biến ở bên trái dấu + =".

Ví dụ. Nếu bạn có a = 10thì a += 5sẽ là: a = a + 5

Vì vậy, "a" bây giờ bằng 15.


Câu trả lời này đóng góp gì mà vẫn chưa được thảo luận? Đó là một lời trùng lặp ...

jdv, chỉ cố gắng giúp đỡ. Tôi là một cộng tác viên mới, rất xin lỗi nếu bạn cho rằng câu trả lời của tôi trùng lặp.

Rõ ràng rằng nó là một bản sao nếu bạn nhìn vào hầu hết các câu trả lời khác. Đóng góp cũng được, nhưng bạn nên cố gắng đóng góp một cái gì đó mới (ví dụ: như câu trả lời add vs iadd) hoặc bạn muốn tìm kiếm một giải pháp rõ ràng hơn. Tuy nhiên, theo như tôi có thể nói, các câu trả lời được bình chọn nhiều nhất rõ ràng như bạn có thể nhận được cho một câu trả lời cơ bản.

4

Lưu ý x += ykhông giống như x = x + ytrong một số trường hợp khi toán tử bổ sung được bao gồm vì toán tử ưu tiên kết hợp với thực tế là phía bên phải luôn được đánh giá trước, ví dụ

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

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

Lưu ý trường hợp đầu tiên mở rộng thành:

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

Bạn có nhiều khả năng gặp phải điều này trong 'thế giới thực' với các nhà khai thác khác, ví dụ:

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


4

+= chỉ là một lối tắt để viết

number = 4
number = number + 1

Vì vậy, thay vào đó bạn sẽ viết

numbers = 4
numbers += 1

Cả hai cách đều đúng nhưng ví dụ hai giúp bạn viết ít mã hơn một chút


1
Hành vi giống nhau về các con số nhưng nó không giống nhau về tổng thể.
plugwash

0

Như những người khác cũng đã nói, toán tử + = là một phím tắt. Một ví dụ:

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

Nó cũng có thể được viết như vậy:

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

Vì vậy, thay vì viết ví dụ đầu tiên, bạn có thể viết ví dụ thứ hai, điều này sẽ hoạt động tốt.


0

Hãy nhớ khi bạn đã từng tính tổng, ví dụ 2 & 3, trong máy tính cũ của bạn và mỗi khi bạn nhấn, =bạn thấy 3 được thêm vào tổng, +=công việc tương tự. Thí dụ:

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

0

Tôi thấy nhiều câu trả lời không hiển thị bằng cách sử dụng + = với nhiều số nguyên.

Một ví dụ:

x -= 1 + 3

Điều này sẽ tương tự như:

x = x - (1 + 3)

và không:

x = (x - 1) + 3

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.