01/10/2018, 11:21

Đ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ỉ?

lahata viết 13:22 ngày 01/10/2018

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.

Minh Hoàng viết 13:35 ngày 01/10/2018

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

Henry viết 13:34 ngày 01/10/2018

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.
Hai Dong viết 13:24 ngày 01/10/2018

tup = (1, 2, 3)

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ỉ?

Henry viết 13:33 ngày 01/10/2018

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

Bài liên quan
0