Python:在列表理解中 split 函数是否被多次评估?

2023-12-13

有件事我一直想知道有一段时间了。在此列表理解中,分割是执行一次还是多次?

l = [line.split()[i] for i in indexes]

我目前以这种方式列出这样的理解:

l = line.rstrip().split()
l = [l for i in indexes]

但我不确定,是否有必要。除了是/否答案之外,我还想知道如何通过 CPU 分析或阅读一些文档来亲自了解这一点。谢谢。


对于每个元素,都会重新计算列表推导式左侧的表达式,是的。

如果您只需要评估一次,则需要完全按照您所做的操作;首先调用它并存储结果以便在列表理解中重复使用。

来自列表显示文档:

在这种情况下,新列表的元素是通过考虑每个元素而产生的元素for or if子句是一个块,从左到右嵌套,并在每次到达最里面的块时评估表达式以生成列表元素.

强调我的。

您还可以使用以下命令反汇编列表理解dis.dis()功能:

>>> import dis
>>> dis.dis(compile('[line.split()[i] for i in indexes]', '', 'eval'))
  1           0 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        

The FOR_ITER操作码开始循环(使用JUMP_ABSOLUTE关闭它),并且每次LOAD_NAME line, LOAD_ATTR split and CALL_FUNCTION被处决。换句话说,字节码 13 到 19 实现了line.split()部分,每次循环都会执行它,该循环从字节码 7 到 29。

(Python 3 注意:列表推导式有自己的作用域,您需要从外部代码对象常量中提取代码对象;dis.dis(compile('[line.split()[i] for i in indexes]', '', 'eval').co_consts[0])).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python:在列表理解中 split 函数是否被多次评估? 的相关文章

随机推荐

  • TypeError:“pygame.Surface”对象不可调用并且 pygame 窗口崩溃

    我对 Pygame 和 Python 很陌生 我刚刚编写了第一个代码 但不知何故我不断收到此错误 TypeError pygame Surface object is not callable 我不知道代码是否有问题 或者只是因为Pygam
  • string_split的结果顺序?

    现在我发现这很棒string split 函数 然后我了解到输出行可以按任意顺序排列 不保证顺序与输入字符串中子字符串的顺序匹配 这使得该功能对我来说毫无用处 也许有解决方法吗 EDIT 例子 SELECT value FROM Strin
  • 当子查询格式错误时,T-SQL 删除表中的所有行[重复]

    这个问题在这里已经有答案了 可能的重复 sql server 2008 Management Studio 不检查我的查询的语法 我今天遇到一个问题 子查询很糟糕 结果是父表中的所有行都被删除 TableA ID Text GUID Tab
  • sed多行替换问题

    我遇到了 sed 替换问题 希望你们中的一位能够帮助我 我确信我错过了一些简单的事情 所以我有一个包含文本和引用的文件 引用本身可以在一行上 也可以跨多行 我希望引用内容单独占一行 作为示例 这里是文件的示例 And he said Thi
  • 发布为 Azure WebJob 在 VS 2013 中不起作用

    我正在尝试使用 Visual Studio 2013 发布一个 Azure 网站以及一些 azure webjobs 我正在关注本教程 我的解决方案具有以下结构 当我尝试将现有项目作为 Web 作业添加到我的 Web 项目中时 我在 项目名
  • 如何清理 Massscan 输出 (-oL)

    我对带有 oL 选项的 Masscan 实用程序生成的输出有疑问 grep able 输出 例如 它输出 Host 143 137 155 7 Ports 80 open tcp Host 177 105 21 41 Ports 8080
  • where_in 和 find_in_set 之间的区别

    我正在处理一个联接查询 其中我必须从包含逗号分隔值的列中获取数据 allowed activity包含1 2 3 4 5 6这就是activity id这是允许的 因此 在查询中 我正在检查当前活动是否允许 为此 我使用了where in并
  • 向 WiX 注册 COM 服务器

    我一直在尝试确定使用 WiX 注册 COM 服务器以创建 Windows Installer 包的最佳解决方案 但我正在努力 在这篇文章中部署工程存档 HOWTO 将 Regsvr32 exe 与 WIX 结合使用 有公开请求 安装警察 通
  • 引起原因:java.sql.SQLException: ORA-01795: 列表中表达式的最大数量为 1000?

    我正在使用 java hibernate Oracle 我有一个包含 3000 多个条目的列表 如果我通过了整个列表 我会得到以下异常 引起原因 java sql SQLException ORA 01795 列表中表达式的最大数量为 10
  • 为什么使用 python 的 GPS 输出为零或 Nan?

    我在 GPS 输出方面遇到问题 当我输入 cat dev ttyUSB0 我有 NMEA 句子出来 这就是我想要的 GPGGA 134131 000 4548 0018 N 01557 1026 E 1 06 1 5 123 8 M 42
  • Class.forName() 是如何工作的?

    我刚刚了解到java sql package 它用Class forName 动态加载扩展的驱动程序DriverManager 然后我们使用DriverManager getConnection method 那么整个事情是如何运作的呢 D
  • PHP非原始类数组作为函数参数

    我想知道 如果可能的话 如何将非原始类数组声明为函数参数 例如
  • 如何获取全局当前的键盘状态? (即当前按下哪些键,无论查询应用程序是否具有焦点)

    我正在编写一个屏幕捕获实用程序 我希望能够在截取屏幕截图时存储键盘和鼠标的当前状态 对鼠标执行此操作很简单 因为使用指针信息类中描述的方式相关问题为您提供当前鼠标位置的屏幕坐标以及单击信息 如果需要 然而 我还没有找到类似的键盘类 所有与键
  • AndroidRuntime:致命异常:androidmapsapi-ZoomTableManager

    我的使用 Google Maps SDK v2 的应用程序刚刚开始崩溃 出现以下异常 Process com currentlocation android PID 7328 java lang ArrayIndexOutOfBoundsE
  • 为什么我无法将代码推送到 github?

    git push origin master To email protected dimitar9 first app git rejected master gt master non fast forward error failed
  • Android OnResume/OnPause 后 Surface 视图 z-index 发生变化

    我对 Android 视图上的 z index 有疑问 我有一个使用 GLSurfaceView 和另一个 SurfaceView 进行视频播放的活动 我在互联网上读到 多个表面视图不能放置在同一布局上 但这些帖子有点旧 我不知道这是否仍然
  • 迭代字典中的键和值

    如何访问字典的键和值并迭代 for 循环 dictionary 1 one 2 two 3 three 我的输出将是这样的 1 one 2 two 3 three 您可以使用此代码片段 dictionary 1 a 2 b 3 c To i
  • 什么时候需要调用 GUI 对象?

    使用 C Windows Forms Invalidate Refresh 等方法是否必须在主 GUI 线程上运行 需要 Invoke BeginInvoke 如何更改 GUI 对象的成员 例如添加 删除点或更改 Charting Char
  • 如何增加QTableWidget垂直滚动条宽度?

    我有一个包含超过 5000 个数据的 QTableWidget 现在我需要增加与 QTableWidget 关联的垂直滚动条的宽度 有人可以帮助我吗 您可以使用样式表来做到这一点 myTableWidget gt verticalScrol
  • Python:在列表理解中 split 函数是否被多次评估?

    有件事我一直想知道有一段时间了 在此列表理解中 分割是执行一次还是多次 l line split i for i in indexes 我目前以这种方式列出这样的理解 l line rstrip split l l for i in ind