没有类名的列表如何创建?

时间:2019-04-01 11:42:29

标签: python python-internals

可以这样创建列表:

l = list()

l.append(1)

不过,最常见的方法是创建一个像这样的列表:

l = [1]

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

我在https://github.com/python/cpython/blob/master/Objects/listobject.c浏览了源代码,找不到在哪里定义列表符号[]。

我不是在问[]和list()之间的区别-我是在问为什么您完全可以使用[]。该对象与其他对象的创建方式有何不同?

2 个答案:

答案 0 :(得分:3)

列表文字[...]由语法定义,与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创建一个列表,然后再将那个传递给list作为参数。

答案 1 :(得分:1)

[1]是一个列表文字-它隐式创建带有list()的{​​{1}}(将其存储在堆中)。我敢肯定,如果您在代码库中再深入一点,便可以找到它。