从导入使用时在python中传递变量*

Nul*_*ull 3 python variables import global

当我运行b.py时,如何使这个打印"baz"?

a.py

    def foo():
        global bar
        print bar

b.py

    from a import *
    bar = "baz"
    foo()
Run Code Online (Sandbox Code Playgroud)

Jer*_*own 6

在一个简单的例子中,大多数情况下的真正答案是使用函数参数(如上所述).但如果重点是测试Python范围规则,那么我想我可以澄清......

如果您正在考虑使用C/C++上下文,那么您很容易对Python导入的工作方式感到困惑.模块导入不像#include指令那样起作用.在C/C++中,编译器将使用#include指令作为标记,用于将源代码从其他源/头文件插入当前源文件(它自己的包含源的本地副本).结果是,当它被编译时,全局变量将被限定为包含所有#included源的编译单元.你可以用#includes的顺序做一些肮脏的技巧来制作一些非常难以理解的代码.:-P

Python导入不提供共享导入模块范围的本地模块实例.相反,它提供对在解释器的当前执行中共享的单例模块对象的引用.模块对象在第一次导入时被实例化.无论是在同一模块中还是从完全不同的模块中进行后续导入,都只能获得对同一模块对象的引用."全球"在其模块中是全球性的.从其他模块中,只能通过对该模块的引用来访问它.例如,在a.py中,您需要导入b以访问"bar"的值.

在您的示例中,您不应该这样做,因为您将进行周期性导入.如果你真的需要设置模块范围的状态,你可以从b模块设置一个全局模块:( a.bar = bar序列依赖地狱).

不要改变a.py,

def foo():
    print bar
Run Code Online (Sandbox Code Playgroud)

但是将b.py改为:

import a
a.bar = "baz"
a.foo()
Run Code Online (Sandbox Code Playgroud)

更好的封装示例将使a.py提供一个函数来设置其全局状态,以便b.py可以执行a.set_module_state( "baz" ).