Trong các mô-đun nội bộ như peephole, đối số của LOAD_CONST
được lưu trữ trong hai byte theo sau opcode
.Tại sao có thể sử dụng hơn 2^16 hằng số trong một hàm Python?
Ví dụ, macro nó sử dụng để có được lập luận của một hoạt động được thực hiện như:
#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
Đối số của LOAD_CONST
là một chỉ số vào mảng consts
.
Vì vậy, tôi đoán có lẽ chúng tôi chỉ có thể sử dụng tối đa 2^16 hằng số trong hàm Python.
Nhưng khi tôi thử nghiệm với một hàm sử dụng hằng số 66666 (> 65536), nó vẫn chạy bình thường.
Lý do có thể là gì?
Bạn đã xây dựng chức năng như thế nào? Kiểm tra 'f .__ code __. Co_consts' và xem liệu có hằng số 66666 actuall ở đó không. Có lẽ họ đã được tối ưu hóa. – user2357112
@ user2357112 Có, tôi đã xác nhận rằng họ vẫn ở đó. – satoru
Tôi đã xây dựng một hàm như vậy và giải mã nó bằng 'dis.dis'. Có vẻ như có một opcode 'EXTENDED_ARG' xử lý nó. – user2357112