如果只需要对它进行一次评估,则需要完全按照自己的意愿进行;首先调用它,并将结果存储在列表推导中。
从 列表显示 文档:
在这种情况下,新列表的元素是通过将每个
fororif子句视为一个块,从左到右嵌套,
并在每次到达最里面的块时评估表达式以产生一个列表元素而生成的元素 。
强调我的。
您还可以使用
dis.dis()函数反汇编列表理解:
>>> import dis>>> dis.dis(compile('[line.split()[i] for i in indexes]', '', 'eval')) 10 BUILD_LIST 0 3 LOAD_NAME 0 (indexes) 6 GET_ITER >> 7 FOR_ITER 22 (to 32) 10 STORE_NAME 1 (i) 13 LOAD_NAME 2 (line) 16 LOAD_ATTR 3 (split) 19 CALL_FUNCTION 0 22 LOAD_NAME 1 (i) 25 BINARY_SUBSCR 26 LIST_APPEND 2 29 JUMP_ABSOLUTE 7 >> 32 RETURN_VALUE
该
FOR_ITER*** 作码开始循环(与
JUMP_ABSOLUTE关闭它),每一次一个
LOAD_NAME line,
LOAD_ATTRsplit和
CALL_FUNCTION被执行。换句话说,字节码13到19实现了该
line.split()部分,并且每次通过循环执行,该循环从字节码7到29运行。
(Python
3注意:列表推导具有其自身的作用域,您需要从外部代码对象常量中提取代码对象;
dis.dis(compile('[line.split()[i] for iin indexes]', '', 'eval').co_consts[0]))。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)