在 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 1list1

我在 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模块

head first python2.共享你的代码 函数模块

Python3 Asyncio 在并发任务之间共享资源

如何在两个模块之间共享数据库模型?

在进程之间共享一个复杂的对象?

python 复习—并发编程——进程数据共享进程锁进程池requests模块和bs4(beautifulsoup)模块