Điểm khác nhau giữa i = i + 1 và i += 1?

hi guys
mình có câu hỏi là trong python, lệnh i = i+ 1 và i += 1 có điểm gì khác nhau không nhỉ?

Có khác nhau: += nó call hàm __iadd__ còn + thì call hàm __add__ cho nên phụ thuộc i là object gì mà giá trị có thể khác.

1 Like

Phép + sẽ tạo ra một giá trị mới sau đó gán lại vào biến cũ, += sẽ trực tiếp cộng vào biến i

1 Like

Theo hiểu biết của em thì nó cũng tùy kiểu dữ liệu nữa. Hash object(immutable) hay là unhash object(mutable)
Ví dụ

>>> lst = [1, 2, 3] # unhash object (mutable)
>>> id(lst)
61179784
>>> lst += [4]
>>> lst
[1, 2, 3, 4]
>>> id(lst)
61179784

Tiếp theo là

>>> tup = (1, 2, 3) # hash object (immutable)
>>> id(tup)
61178144
>>> tup += (4,)
>>> tup
(1, 2, 3, 4)
>>> id(tup)
61090960
# ... tuple tương tự như string (một hash object khác)

Riêng về cái đề bài hỏi thì em nghĩ là 2 cái same với nhau vì phương thức __iadd__ không có trong hash object (immutable). Hai ví dụ trên là ví dụ minh họa

>>> i = 1
>>> id(i)
1521702640
>>> i += 1
>>> i
2
>>> id(i)
1521702656

Để chắc chắn. Hãy test

>>> lst = [1, 2]
>>> lst.__iadd__([3])
[1, 2, 3]
>>> lst
[1, 2, 3]
>>> a = 3
>>> a.__iadd__(4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute '__iadd__'

Kết luận

  • Với hash object (immutable) thì (a = a + something) == (a += something), __iadd__ sẽ được thay thế bởi __add__.
  • Ngược lại thì có __iadd__. Mà có thì dùng thôi.
4 Likes

Mình mới biết 2 kiểu đối tượng. Đó là list [ ] , dictionary { }, khai báo kiểu () thì là đối tượng gì nhỉ?

Bạn tham khảo link này. Tìm hiểu thêm cái này, bạn có thể biết thêm được phần unpacking and packing argument
https://docs.python.org/3/tutorial/datastructures.html#tuples-and-sequences

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?