在 Python 模块之间共享列表
Posted
技术标签:
【中文标题】在 Python 模块之间共享列表【英文标题】:Sharing a list between Python modules 【发布时间】:2018-04-21 11:30:08 【问题描述】:所以反馈促使我创建一个包含常用例程的包,因此我不必再将函数复制/粘贴到新模块中。这很好用,但现在我遇到了一个问题。我的模块 2 函数 f2
应该从模块 1 调用,编号为 n1
。如果list1
存在于模块1中,f2
使用它来分析n1
,否则它必须从头开始创建list2
进行分析。到目前为止,我的方法是使用可选参数。
module1.py
from standardpackage.module2 import f2
list1 = [1, 2, 3]
n = 1
a = f2(n, list1) #works with existing list1
b = f2(n) #works without list1
module2.py
def f2(n, *arg):
if arg:
list2 = arg[0] #uses list1
else:
list2 = [3, 2, 1] #uses its own list
res = dosth(n, list2) #code executed within module2
return res
这种方法确实,它应该做的,但恕我直言,它看起来并不聪明。我从经验中知道,list1
可能很长,f2()
可能会被调用数百万次。每次都创建list1
的副本,调用f2()
,似乎浪费时间和内存空间。
我的问题是:module 2
能否以某种方式使用来自module 1
的list1
?
我在 SO 和教程网站上阅读了有关全局变量共享的内容,现在明白了为什么我的 global list1
方法不起作用。我看到了将模块 1 绑定到模块 2 的建议,但我想在以后的项目中使用模块 2,所以我不知道这些模块的名称。我已经看到有关线程和多处理的建议,但作为 Python 新手,我不明白与我的问题的相关性。欢迎任何建议。谢谢。
【问题讨论】:
您可以直接将arg[0]
传递给dosth
函数,而不是将arg[0] 复制到list2 中
【参考方案1】:
您可以通过将 arg[0] 直接传递给 dosth
函数来避免复制,还对您的代码进行了一些更改
def f2(n, *arg):
if not arg:
list2 = [3, 2, 1]
return dosth(n, list2)
return dosth(n, arg[0])
【讨论】:
这可能会产生误导 - dosth 不是函数,而是在模块 2 中执行的代码。它使用列表 1 或新创建的列表 2。我将编辑我的帖子,以明确这一点。 这是一个冗长的素因子分析,代码不会对这个问题做出贡献。这个想法是,一些模块可能已经有一个预先计算的素数列表list1
,而module 2
也应该针对单个非常大的数字临时工作。以上是关于在 Python 模块之间共享列表的主要内容,如果未能解决你的问题,请参考以下文章
在dask.distributed群集中的计算机之间共享python模块