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.
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.
Câu trả lời:
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.
__iadd__
trả về một kiểu khác nhau (mà chính nó là thích nghi được)
x += 5
không hoàn toàn giống như nói x = x + 5
bằ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?
x += 7,8,9
+=
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.
&=
, >>=
, vv) và các nhà khai thác toán bổ sung ( **=
, vv).
Nó thêm toán hạng bên phải vào bên trái. x += 2
có nghĩax = x + 2
Nó cũng có thể thêm các phần tử vào danh sách - hãy xem chủ đề SO này .
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.
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.
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ì?
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].
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 = 10
thì a += 5
sẽ là: a = a + 5
Vì vậy, "a" bây giờ bằng 15.
Lưu ý x += y
không giống như x = x + y
trong 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
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.
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
Theo tài liệu
x += y
tương đương vớix = operator.iadd(x, y)
. Một cách khác để nói điều đóz = operator.iadd(x, y)
tương đương với câu lệnh ghépz = x; z += y
.
Vì vậy, x += 3
cũng giống như x = x + 3
.
x = 2
x += 3
print(x)
sẽ xuất ra 5.
Lưu ý rằng cũng có
object.__iadd__