【问题标题】:List splice assignment space complexity?列表拼接分配空间复杂度?
【发布时间】:2017-11-06 01:18:02
【问题描述】:

我相信在 python 中拼接列表总是会创建列表的浅表副本。但是,这对于拼接任务仍然适用吗?

例如:

list[::10] = list[10:20]

list[::10] 会创建一个新列表吗?如果我的理解是正确的, list[::10] 不使用任何空间,但 list[10:20] 通过创建新列表来使用空间

【问题讨论】:

    标签: python-3.x


    【解决方案1】:

    使用dis,我们可以查看 Python 解释器实际将我们的代码解释成什么。

    from dis import dis
    
    dis('l[::10] = l[10:20]')
    

    给我们

      1           0 LOAD_NAME                0 (l)
                  3 LOAD_CONST               0 (10)
                  6 LOAD_CONST               1 (20)
                  9 BUILD_SLICE              2
                 12 BINARY_SUBSCR
                 13 LOAD_NAME                0 (l)
                 16 LOAD_CONST               2 (None)
                 19 LOAD_CONST               2 (None)
                 22 LOAD_CONST               0 (10)
                 25 BUILD_SLICE              3
                 28 STORE_SUBSCR
                 29 LOAD_CONST               2 (None)
                 32 RETURN_VALUE
    

    我们可以看到有两个BUILD_SLICE 操作,一个用于l[::10],另一个用于l[10:20]。所以这两个切片在内存中都由对象表示。

    编辑:

    值得注意的是,这是 CPython 3.5 的反汇编字节码

    CPython 是“标准”实现,但其他 Python 实现/版本可能会有所不同。

    【讨论】:

      猜你喜欢
      • 2019-05-05
      • 2011-05-22
      • 1970-01-01
      • 2018-12-02
      • 2016-02-13
      • 2012-08-14
      • 2023-02-07
      • 2015-02-14
      • 2017-09-12
      相关资源
      最近更新 更多