如何创建没有 class 名称的列表?
How are lists created without the class name?
可以像这样创建列表:
l = list()
l.append(1)
然而,最常用的方法是创建这样的列表:
l = [1]
我的问题在概念上很简单,但在答案上可能非常复杂,但是列表是如何使用通常 class 符号之外的符号创建的?
我查看了 https://github.com/python/cpython/blob/master/Objects/listobject.c 的源代码,但找不到它定义列表符号 [].
的位置
我不是在问 [] 和 list() 之间的区别 - 我是在问为什么你可以使用 []。这个对象的创建方式怎么可能与其他对象不同?
[1]
是一个列表文字 - 它隐式创建了 list()
和 1
(将其存储在堆中)。如果您在代码库中多挖掘一点,我相信您可以找到它。
列表文字 [...]
由语法定义,与 if
和 while
:
等关键字相同
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
。
可以像这样创建列表:
l = list()
l.append(1)
然而,最常用的方法是创建这样的列表:
l = [1]
我的问题在概念上很简单,但在答案上可能非常复杂,但是列表是如何使用通常 class 符号之外的符号创建的?
我查看了 https://github.com/python/cpython/blob/master/Objects/listobject.c 的源代码,但找不到它定义列表符号 [].
的位置我不是在问 [] 和 list() 之间的区别 - 我是在问为什么你可以使用 []。这个对象的创建方式怎么可能与其他对象不同?
[1]
是一个列表文字 - 它隐式创建了 list()
和 1
(将其存储在堆中)。如果您在代码库中多挖掘一点,我相信您可以找到它。
列表文字 [...]
由语法定义,与 if
和 while
:
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
。