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)
在一个简单的例子中,大多数情况下的真正答案是使用函数参数(如上所述).但如果重点是测试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" )
.
归档时间: |
|
查看次数: |
10937 次 |
最近记录: |