作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试了解 __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
类型?
最佳答案
如果您使用 dis
模块检查 CPython 解释器如何处理 []
,您会看到它生成了 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 都会在 __builtin__
伪模块中搜索 list
构造函数,那将是慢得多,所以这种行为可以被认为是一种优化。
所以你的要求在 vanilla CPython 中是无法实现的。
关于python - 如何将 [] 与自定义 __builtin__ 列表一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41863850/
我是一名优秀的程序员,十分优秀!