[我看过一篇提到它的博客文章“使用func.__code__.co_consts
检查函数中定义的所有常量”。
def func():
return 1 in {1,2,3}
func.__code__.co_consts
(None, 1, frozenset({1, 2, 3}))
为什么返回frozenset
?
def func():
return 1 in [1,2,3]
func.__code__.co_consts
(None, 1, (1,2,3))
为什么它返回tuple
而不是列表?从__code__.co_consts
返回的每个对象都是immutable。为什么将可变常量设为immutable?为什么返回的元组的第一个元素总是None
?
这是Python Peephole optimizer的结果>
在“优化”下,它说:
BUILD_LIST + COMPARE_OP(in/not in): convert list to tuple BUILD_SET + COMPARE_OP(in/not in): convert set to frozenset
请参见here以获取更多信息:
“ Python通过预先计算常量表达式或转换某些数据结构来对代码进行窥视孔优化”
尤其是有关“ 会员资格测试
”的部分用于成员资格测试的Python是将可变数据结构转换为其不变的版本。列表被转换为元组,并被设置为冻结集。“
co_consts
中的所有对象都是常量,即它们是不可变的。例如,您不应该能够在源代码中附加到以文字形式显示的列表,从而无法修改函数的行为。