Computer >> Máy Tính >  >> Lập trình >> Python

A + =B Câu đố về bài tập trong Python

Trong chương này, chúng ta sẽ thấy điều gì sẽ xảy ra khi chúng ta cập nhật các giá trị trong một bộ tuple, điều này thực sự là bất biến. Chúng tôi sẽ có thể hợp nhất các giá trị mới với các giá trị cũ nhưng điều đó gây ra lỗi. Chúng tôi có thể nghiên cứu mã bytecode của lỗi và hiểu rõ hơn cách thức hoạt động của các quy tắc cho tuple.

Đầu tiên, chúng tôi xác định một bộ tuple và sau đó đưa ra lệnh để cập nhật phần tử cuối cùng của nó như được hiển thị bên dưới.

Ví dụ

>>> tupl =(5,7,9, [1,4])>>> tupl [3] + =[6,8] 

Đầu ra

Chạy đoạn mã trên cho chúng ta kết quả sau -

 Traceback (lần gọi gần đây nhất):Tệp "", dòng 1, inTypeError:đối tượng 'tuple' không hỗ trợ gán mục>>> tupl (5, 7, 9, [1, 4, 6, 8]) 

Bây giờ chúng ta nghiên cứu mã byte của cách tiếp cận trên, chúng tôi đặt mã vào một hàm và áp dụng phương thức dis để hiển thị mã byte. Chúng tôi gặp cùng một lỗi nhưng có nhiều chi tiết hơn.

Ví dụ

 def immut_ Chức năng ():tupl =(5,7,9, [1,4]) tupl [3] + =[6,8] immut_ Chức năng () 

Đầu ra

Chạy đoạn mã trên cho chúng ta kết quả sau -

 TypeError Traceback (cuộc gọi gần đây nhất sau cùng) trong () 2 tupl =(5,7,9, [1,4]) 3 tupl [3] + =[6,8] ----> 4 immut_ functions ( ) trong Immut_ Chức năng () 1 def immut_ Chức năng ():2 tupl =(5,7,9, [1,4]) ----> 3 tupl [3] + =[6,8] 4 immut_ Chức năng () LoạiError:đối tượng 'tuple' không hỗ trợ gán mục 

Tiếp theo, chúng tôi hiển thị bytecode của hàm trên để xem chi tiết về việc gán bộ tuple và các lỗi.

Ví dụ

 nhập disdis.dis (immut_ Chức năng) 

Đầu ra

Chạy đoạn mã trên cho chúng ta kết quả sau -

 2 0 LOAD_CONST 1 (5) 3 LOAD_CONST 2 (7) 6 LOAD_CONST 3 (9) 9 LOAD_CONST 4 (1) 12 LOAD_CONST 5 (4) 15 BUILD_LIST 2 18 BUILD_TUPLE 4 21 STORE_FAST 0 (tupl) 3 24 LOAD_FAST 0 (tupl) 27 LOAD_CONST 6 (3) 30 DUP_TOPX 2 33 BINARY_SUBSCR 34 LOAD_CONST 7 (6) 37 LOAD_CONST 8 (8) 40 BUILD_LIST 2 43 INPLACE_ADD 44 ROT_THREE 45 STORE_SUBSCR 46 LOAD_CONST 0 (Không có) 49 RETpre> 

Kết luận là không đặt các phần tử có thể thay đổi vào một bộ. Mặc dù có thể chuyển nhượng, nhưng nó ném ra một ngoại lệ. Như được hiển thị trong bước với giá trị 46, việc gán không thành công vì tuple là một đối tượng bất biến.