Các toán tử gán "tăng cường" như +=
đã được giới thiệu trong Python 2.0, được phát hành vào tháng 10 năm 2000. Thiết kế và lý do được mô tả trong PEP 203 . Một trong những mục tiêu được tuyên bố của các nhà khai thác này là sự hỗ trợ của các hoạt động tại chỗ. Viết
a = [1, 2, 3]
a += [4, 5, 6]
được cho là để cập nhật danh sách a
tại chỗ . Điều này quan trọng nếu có các tham chiếu khác đến danh sách a
, ví dụ: khi a
được nhận làm đối số hàm.
Tuy nhiên, hoạt động không phải lúc nào cũng diễn ra, vì nhiều loại Python, bao gồm số nguyên và chuỗi, là bất biến , vì vậy, ví dụ, i += 1
đối với một số nguyên i
không thể hoạt động tại chỗ.
Tóm lại, các toán tử gán gán tăng cường được cho là hoạt động tại chỗ khi có thể và tạo một đối tượng mới theo cách khác. Để tạo điều kiện cho các mục tiêu thiết kế này, biểu thức x += y
đã được chỉ định để hành xử như sau:
- Nếu
x.__iadd__
được xác định, x.__iadd__(y)
được đánh giá.
- Mặt khác, nếu
x.__add__
được thực hiện x.__add__(y)
được đánh giá.
- Mặt khác, nếu
y.__radd__
được thực hiện y.__radd__(x)
được đánh giá.
- Nếu không sẽ gây ra một lỗi.
Kết quả đầu tiên thu được từ quá trình này sẽ được gán lại x
(trừ khi kết quả đó là NotImplemented
đơn, trong trường hợp đó, việc tra cứu tiếp tục với bước tiếp theo).
Quá trình này cho phép các loại hỗ trợ sửa đổi tại chỗ để thực hiện __iadd__()
. Các loại không hỗ trợ sửa đổi tại chỗ không cần thêm bất kỳ phương thức ma thuật mới nào, vì Python sẽ tự động quay trở lại về cơ bản x = x + y
.
Vì vậy, cuối cùng chúng ta hãy đến với câu hỏi thực tế của bạn - tại sao bạn có thể thêm một tuple vào danh sách với toán tử gán tăng. Từ bộ nhớ, lịch sử của điều này đại khái như thế này: list.__iadd__()
Phương thức được triển khai để gọi list.extend()
phương thức đã có sẵn trong Python 2.0. Khi các trình vòng lặp được giới thiệu trong Python 2.1, list.extend()
phương thức đã được cập nhật để chấp nhận các trình vòng lặp tùy ý. Kết quả cuối cùng của những thay đổi này là my_list += my_tuple
hoạt động bắt đầu từ Python 2.1. Các list.__add__()
phương pháp, tuy nhiên, không bao giờ được cho là để hỗ trợ lặp tùy ý như là đối số bên tay phải - đây được coi là không phù hợp cho một ngôn ngữ mạnh mẽ gõ.
Cá nhân tôi nghĩ rằng việc triển khai các toán tử tăng cường đã kết thúc quá phức tạp trong Python. Nó có nhiều tác dụng phụ đáng ngạc nhiên, ví dụ mã này:
t = ([42], [43])
t[0] += [44]
Dòng thứ hai tăng TypeError: 'tuple' object does not support item assignment
, nhưng dù sao thì thao tác vẫn được thực hiện thành công - t
sẽ là ([42, 44], [43])
sau khi thực hiện dòng gây ra lỗi.