在像peephole这样的内部模块中,参数 ofLOAD_CONST
存储在opcode
.
例如,它用于获取操作参数的宏实现为:
#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
的参数是数组LOAD_CONST
的索引。consts
所以我猜也许我们在 Python 函数中最多只能使用 2 ^ 16 个常量。
但是当我尝试使用 66666 (> 65536) 常量的函数时,它仍然可以正常运行。
可能是什么原因?
在像peephole这样的内部模块中,参数 ofLOAD_CONST
存储在opcode
.
例如,它用于获取操作参数的宏实现为:
#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
的参数是数组LOAD_CONST
的索引。consts
所以我猜也许我们在 Python 函数中最多只能使用 2 ^ 16 个常量。
但是当我尝试使用 66666 (> 65536) 常量的函数时,它仍然可以正常运行。
可能是什么原因?
从dis
文档:
EXTENDED_ARG(分机)
为参数太大而无法放入默认两个字节的任何操作码添加前缀。ext 包含两个附加字节,它们与后续操作码的参数一起构成一个四字节参数,ext 是两个最重要的字节。
如果操作码需要超过 2 个字节的参数,则 EXTENDED_ARG 操作码会提供 2 个多字节的参数。