如何从两个存在依赖关系的模块导入代码?解析Python跨模块变量引用的NameError问题
为什么import后的函数找不到变量?
嘿,这个问题刚好戳中了Python模块机制和函数作用域的核心细节,你之前的“import是代码复制”的理解确实漏掉了两个关键要点:
1. 每个模块都有独立的命名空间
Python里每个.py文件都是一个独立的模块,各自拥有专属的命名空间。当你在c.py里执行from a import *,只是把a模块里的var导入到了c自己的命名空间,但b模块的命名空间和c、a是完全分开的——b.py里的prnt函数根本不知道c或者a里有个var存在。
2. 函数遵循词法作用域(定义时的环境)
Python的函数变量查找规则是**“看定义时的作用域,不是调用时的”**。prnt函数是在b.py里定义的,定义它的时候,b的命名空间里没有var这个变量,所以不管你在c.py里怎么调用它,它都会回到自己定义时的环境去找var,找不到就抛出NameError。
你以为的“等价代码”其实和真实import场景完全不一样:
你想象的等价代码:
var = 2 def prnt(): print(var) prnt()
这里所有代码都在同一个命名空间里,prnt定义时能直接看到当前作用域的var,自然能正常运行。但真实import场景是三个独立的命名空间(a、b、c),prnt的定义环境里没有var,所以报错。
怎么解决这个问题?
如果想让prnt能访问到var,可以在b.py里主动导入a的变量:
# b.py from a import var def prnt(): print(var)
这样prnt定义时的作用域里就有了var,调用时就能正常打印了。
内容的提问来源于stack exchange,提问作者Dingsda
相关产品推荐
相关产品推荐

