parent/__init__.py
:
favorite_numbers = [1]
def my_favorite_numbers():
for num in favorite_numbers:
num
my_favorite_numbers()
from .child import *
my_favorite_numbers()
parent/child.py
:
print favorite_numbers
favorite_numbers.append(7)
然后,我从名为tst.py
的父目录创建了一个目录:
import parent
所以目录结构如下所示:
parent (directory)
__init__.py (file)
child.py (file)
tst.py (file)
我在执行时遇到此错误:
NameError: name 'favorite_numbers' is not defined
如何在child.py中的favorite_numbers中添加一个值,这样当我执行my_favorite_numbers()函数时,我得到1和7。
答案 0 :(得分:3)
在Python中,每个模块都有自己独立的全局变量。这实际上是模块的重点(与C预处理器风格的文本插入相反)。
执行from .child import *
时导入.child
,然后将其所有全局变量复制到当前模块的全局变量中。他们仍然使用自己的全局分离模块。
如果要在不同模块中的代码之间传递值,您可能希望将该代码包装在函数中,然后将值作为函数参数传递并返回值。例如:
parent/__init__.py
:
from .child import *
favorite_numbers = [1]
def my_favorite_numbers():
for num in favorite_numbers:
num
my_favorite_numbers()
child_stuff(favorite_numbers)
my_favorite_numbers()
parent/child.py
:
def child_stuff(favorite_numbers):
print favorite_numbers
favorite_numbers.append(7)
实际上,除了初始化(定义函数和类,创建常量和其他单例等)之外,你几乎总是想要包含任何代码。当您import
一个模块(包括from … import
)时,它仅在第一次运行其顶级代码时。如果再次import
,模块对象已经存在于内存中(在sys.modules
内),因此Python将使用它,而不是运行代码来再次构建它。
如果你真的想将值推送到另一个模块的命名空间,你可以,但你必须明确地这样做。这意味着您必须通过导入模块对象来获得模块对象,而不仅仅是从导入:
from . import child
child.favorite_numbers = favorite_numbers
但这不是一个好主意。
答案 1 :(得分:0)
你有没有运行过setup.py或者#34;构建"你的图书馆?
我会创建一个setup.py文件,并可能在开发模式下运行它。 Python setup.py develop vs install