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ỉ?
Điểm khác nhau giữa i = i + 1 và i += 1?
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.
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
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.
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
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?