栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Dict / Set解析顺序一致性

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Dict / Set解析顺序一致性

字典显示

如果给出了逗号分隔的键/基准对序列,则从左到右评估它们以定义词典的条目:每个键对象都用作词典中的键以存储相应的基准。这意味着您可以在“键/基准”列表中多次指定相同的键,并且该键的最终字典值将是最后给出的值。

与list和set理解相反,dict理解需要两个表达式之间用冒号分隔,后跟通常的“ for”和“
if”子句。运行理解时,将生成的键和值元素按生成顺序插入新字典中。

设置显示

集合显示将产生一个新的可变集合对象,其内容由一系列表达式或理解来指定。提供逗号分隔的表达式列表时,将从左到右评估其元素并将其添加到set对象中。提供理解时,集合是由理解产生的元素构成的。

调用set构造函数或使用理解和普通文字有区别。

def f1():    return {x for x in [True, 1]}def f2():    return set([True, 1])def f3():    return {True, 1}print(f1())print(f2())print(f3())import disprint("f1")dis.dis(f1)print("f2")dis.dis(f2)print("f3")dis.dis(f3)

输出:

{True}{True}{1}

如何创建它们会影响结果:

    6050 LOAD_ConST    1 (<pre object <setcomp> at 0x7fd17dc9a270, file "/home/padraic/Dropbox/python/test.py", line 605>)   3 LOAD_ConST    2 ('f1.<locals>.<setcomp>')   6 MAKE_FUNCTION 0   9 LOAD_ConST    3 (True)  12 LOAD_ConST    4 (1)  15 BUILD_LIST    2  18 GET_ITER  19 CALL_FUNCTION 1 (1 positional, 0 keyword pair)  22 RETURN_VALUEf26080 LOAD_GLOBAL   0 (set)   3 LOAD_ConST    1 (True)   6 LOAD_ConST    2 (1)   9 BUILD_LIST    2  12 CALL_FUNCTION 1 (1 positional, 0 keyword pair)  15 RETURN_VALUEf36110 LOAD_ConST    1 (True)   3 LOAD_ConST    2 (1)   6 BUILD_SET     2   9 RETURN_VALUE

BUILD_SET
当您传递一个纯文本并用逗号分隔时,Python仅运行字节码:

提供逗号分隔的表达式列表时,将从左到右评估其元素并将其添加到set对象中。

理解的行:

提供理解时,集合是由理解产生的元素构成的。

因此,由于Hamish提交了错误报告,确实确实

BUILD_SET
按照链接中Raymond
Hettinger的评论归结为操作码 。罪魁祸首是 Python /
ceval.c中的BUILD_SET操作码,它不必要地向后循环
,其实现如下:

 TARGET(BUILD_SET) { PyObject *set = PySet_New(NULL); int err = 0; if (set == NULL)     goto error; while (--oparg >= 0) {     PyObject *item = POP();     if (err == 0)         err = PySet_Add(set, item);     Py_DECREF(item); } if (err != 0) {     Py_DECREF(set);     goto error; } PUSH(set); DISPATCH();        }


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/669205.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号