Edit: (để giải quyết các vấn đề bổ sung nêu ra bởi chỉnh sửa cho câu hỏi):
a = a + b
và a += b
không phải là những hoạt động tương tự. Trước đây, thực hiện a.__add__(b)
, sau đó thực hiện a.__iadd__(b)
("bổ sung tại chỗ").
Sự khác biệt giữa hai là trước đây luôn tạo đối tượng mới (và rebinds tên a
thành đối tượng mới) trong khi sau này sửa đổi đối tượng tại chỗ (nếu có thể và với danh sách, nó có thể).
Để minh họa điều này, chỉ cần nhìn vào địa chỉ của đối tượng của bạn:
>>> a = [1, 2]
>>> id(a)
34660104
>>> a = a + [a]
>>> id(a)
34657224
>>> id(a[2])
34660104
Các "mới" a
được xây dựng từ đầu, đầu tiên lấy giá trị từ danh sách cũ a
, sau đó concatenating tham chiếu đến đối tượng cũ với nó.
Contrast này để:
>>> a = [1, 2]
>>> id(a)
34658632
>>> a += [a]
>>> id(a)
34658632
>>> id(a[2])
34658632
(Cũ câu trả lời, giải thích tài liệu tham khảo theo chu kỳ):
Hãy xem xét điều này:
>>> a = [1, 2]; a += a
>>> a
[1, 2, 1, 2]
>>> a = [1, 2]; a.extend(a)
>>> a
[1, 2, 1, 2]
>>> a = [1, 2]; a += [a]
>>> a
[1, 2, [...]]
>>> a = [1, 2]; a.append(a)
>>> a
[1, 2, [...]]
Vì vậy, để tóm tắt phần đầu:
Đối với danh sách, a += a
tương đương với việc gọi a.extend(a)
sửa đổi a
tại chỗ, thêm bản sao của các thành phần được tìm thấy trong a
khi bắt đầu thao tác này.
Ngược lại, a += [a]
tương ứng với a.append(a)
, cả hai đều tạo ra một tài liệu tham khảo vào danh sách a
(i. E. Một con trỏ đến địa chỉ của nó trong bộ nhớ) và thêm rằng vào danh sách. Mà cấu thành một cái gọi là "tham chiếu tuần hoàn".
Nếu bạn đã nhìn vào các đại diện nội bộ của a
tại thời điểm đó, nó sẽ giống như thế này:
a: Reference to a list object at address 0xDEADBEEF
a[0]: Reference to the integer object "1"
a[1]: Reference to the integer object "2"
a[2]: Reference to the same list object at address 0xDEADBEEF
phiên bản Cũ Python (pre-1.5.1) không đủ thông minh để phát hiện , vì vậy nếu bạn đã làm một số print a
, bạn sẽ nhận được [1, 2, [1, 2, [1, 2, [1, 2, [1, 2, [1, 2, ...
v.v. trong một vòng lặp vô hạn. Kể từ Python 1.5.1, trình thông dịch phát hiện điều này, thay vào đó hãy in [1, 2, [...]]
.
http://stackoverflow.com/questions/2347265/what-does-plus-equals-do-in-python – Dogbert
'a = [1, 2]; a + = a' sẽ tạo '[1, 2, 1, 2]', không phải '[1, 2, [1, 2]'. Xem câu hỏi trùng lặp. – khachik
Cái gọi là trùng lặp không thảo luận về danh sách dấu chấm lửng * ở tất cả *. – Marcin