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


