Python模块中“list=list”的效果是什么?

42 投票
1 回答
648 浏览
提问于 2025-04-17 10:10

我在Python标准库的这个文件里看到了以下代码:/usr/lib/python2.7/multiprocessing/dummy/__init__.py

list = list
dict = dict

这个写法是什么意思呢?我猜测是:“我们来检查一下dictlist是否存在”。

这只是古老时代留下来的代码吗?那个时候__builtins__里没有listdict吗?

我还有一个疯狂的猜测:为了提高查找速度,把list从全局范围移到模块范围,这样做合理吗?不过如果我把这个猜测应用到多进程上,发现这个假设是错的。

1 个回答

30

导出。然后你可以这样做:

from multiprocessing.dummy import list

... 这实际上就是普通的 list

如果没有那一行代码,包 multiprocessing.dummy 中就不会有 list 这个东西。

这样做是为了让不同的包之间有统一的接口。比如说,所有的包都应该提供一个 list 类。包 a 选择提供一个自定义的实现,而包 b 则想使用 __builtins__ 中的 list

powerful/__init__.py:
from powerfulinternals import PowerfulList as list
from simple.simpleinternals import Something as whoo

simple/__init__.py:
list = list
from simpleinternals import Something as whoo

application.py:
try:
  import powerful as api
else:
  import simple as api

mylist = api.list()
woot = api.whoo()

这样做还有更多原因。例如,可以明确你正在使用的是什么。

list = list

这也可以看作是一个声明:“如果你想改变我使用的列表类型,就在这里改。”

在这个特定的情况下,确实是前者。listdict 被暴露为:

manager = multiprocessing.dummy.Manager()
l = manager.list()
d = manager.dict()

Manager 的定义是:

def Manager():
  return sys.modules[__name__]

也就是说,Manager.list = list

撰写回答