Python:是否在列表理解中对split函数进行了多次评估?

Python:是否在列表理解中对split函数进行了多次评估?,第1张

Python:是否在列表理解中对split函数进行了多次评估?

对于每个元素,列表推导中左侧的表达式将重新评估,是的。

如果只需要对它进行一次评估,则需要完全按照自己的意愿进行;首先调用它,并将结果存储在列表推导中。

列表显示 文档:

在这种情况下,新列表的元素是通过将每个

for
or
if
子句视为一个块,从左到右嵌套,
并在每次到达最里面的块时评估表达式以产生一个列表元素而生成的元素

强调我的。

您还可以使用

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])
)。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5650547.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存