我试图理解__builtin__
在Python中是如何工作的。我的代码如下:
import __builtin__
class MyList(list):
pass
__builtin__.list = MyList
a = [1,2,3,4,5]
b = list([1,2,3,4,5])
print 'A: ', type(a)
print 'B: ', type(b)
当我打印两个列表的类型时,我得到:
A: <type 'list'>
B: <class '__main__.MyList'>
为什么不是MyList
类型的两个列表以及如何实现[]
语法也可以是MyList
类型?
答案 0 :(得分:2)
如果您检查CPython解释器使用[]
模块处理dis
的方式,您会看到它生成BUILD_LIST
指令:
>>> def x():
... x = [1,2]
...
>>> dis.dis(x)
2 0 LOAD_CONST 1 (1)
3 LOAD_CONST 2 (2)
6 BUILD_LIST 2
9 STORE_FAST 0 (x)
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
相应的指令触发直接调用C函数PyList_New
(它在ceval.c中处理):
2202 case BUILD_LIST:
2203 x = PyList_New(oparg);
我认为如果CPython每次在list
伪模块中搜索__builtin__
构造函数时会在源代码中使用[]
,那么它会慢得多,所以这种行为可以被认为是优化。
所以你所要求的是在香草CPython中无法实现的。