【问题标题】:How are lists created without the class name?没有类名如何创建列表?
【发布时间】:2019-04-01 11:42:29
【问题描述】:

可以像这样创建列表:

l = list()

l.append(1)

然而最常用的方法是创建一个这样的列表:

l = [1]

我的问题在概念上很简单,但答案可能非常复杂,但是列表是如何使用通常类符号之外的符号创建的?

我查看了https://github.com/python/cpython/blob/master/Objects/listobject.c 的源代码,但找不到它定义列表符号 [] 的位置。

我不是在问 [] 和 list() 之间的区别——我是在问你为什么可以使用 []。这个对象的创建方式怎么可能与其他对象不同?

【问题讨论】:

标签: python python-internals


【解决方案1】:

列表文字[...]由语法定义,与ifwhile等关键字相同:

atom: ... | '[' [testlist_comp] '] | ...

当代码生成器在 AST 中遇到一个列表字面量时,它会生成一个特定的字节码来创建一个列表:

>>> import dis
>>> dis.dis('[]')
  1           0 BUILD_LIST               0
              2 RETURN_VALUE

而对list 的调用的处理方式与任何其他可调用对象一样:

>>> dis.dis('list()')
  1           0 LOAD_NAME                0 (list)
              2 CALL_FUNCTION            0
              4 RETURN_VALUE

对于非空列表,将文字中的表达式添加到堆栈中以供BUILD_LIST 使用:

>>> dis.dis('list([1,2])')
  1           0 LOAD_NAME                0 (list)
              2 LOAD_CONST               0 (1)
              4 LOAD_CONST               1 (2)
              6 BUILD_LIST               2
              8 CALL_FUNCTION            1
             10 RETURN_VALUE

list([1,2]) 这样的调用必须首先使用BUILD_LIST 创建一个列表,然后将that 作为参数传递给list

【讨论】:

    【解决方案2】:

    [1] 是一个列表文字 - 它隐式创建 list()1 (将其存储在堆中)。我敢肯定,如果您再深入研究一下代码库,您会发现这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多