为什么集合对象存储为Frozenset,列表对象存储为元组

问题描述 投票:2回答:2

[我看过一篇提到它的博客文章“使用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 list set python-internals
2个回答
1
投票

这是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是将可变数据结构转换为其不变的版本。列表被转换为元组,并被设置为冻结集。“


0
投票

co_consts中的所有对象都是常量,即它们是不可变的。例如,您不应该能够在源代码中附加到以文字形式显示的列表,从而无法修改函数的行为。

© www.soinside.com 2019 - 2024. All rights reserved.