社区
脚本语言
帖子详情
一个全局变量访问的问题
CoolQ
2006-10-17 04:22:24
mod1.py
import mod2
var_1 = ''
if __name__ == '__main__':
var_1 = 'haha'
mod2.foo()
mod2.py
def foo():
local_var = ...? # 访问mod1的var_1,也就是'haha',该怎么写?
虽然可以通过参数把值传给foo,
但是如果mod1的全局变量太多这样很不方便
...全文
342
16
打赏
收藏
一个全局变量访问的问题
mod1.py import mod2 var_1 = '' if __name__ == '__main__': var_1 = 'haha' mod2.foo() mod2.py def foo(): local_var = ...? # 访问mod1的var_1,也就是'haha',该怎么写? 虽然可以通过参数把值传给foo, 但是如果mod1的全局变量太多这样很不方便
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
16 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
CoolQ
2006-10-24
打赏
举报
回复
与其这么麻烦,还是用os.environ['globals'] = { 'a':'foo', 'b':'bar' }
CoolQ
2006-10-23
打赏
举报
回复
#mod1.py
import mod2
import mod3
class Vars:
def __init__(self):
self.foo = 'bar'
self.bar = 'barbar'
self.foobar = 'foobar'
var = Vars()
if __name__ == '__main__':
var.foo = 'hehe'
mod2.foo()
mod2.bar()
mod3.printFoobar(var)
#mod2.py
import mod1
var = mod1.var#作为全局变量
def foo():
print var.foo
def bar():
print var.bar
print var.foobar
#mod3.py
def printFoobar(vars_obj):#做为对象传递
print vars_obj.foo
print vars_obj.bar
print vars_obj.foobar
结果不正确,输出的foo都是'bar'而不是'hehe'
你指向的其实是同一个类的两个不同实例
iambic
2006-10-23
打赏
举报
回复
哦,对不起,才发现你说的问题。你说的是__main__和mod1其实不是一个模块?
把
var = Vars()
改成这样是否可以:
if __name__ == '__main__':
from mod1 import var
else:
var = Vars()
因为只有var一个变量,所以只需要改这么一句。
iambic
2006-10-20
打赏
举报
回复
如果你按我说的,只把这个对象设成全局的,就可以减少全局变量,也不用频繁传递了。
而且即使当你想传递的时候,比如修改设计为多线程,需要有自己的独立数据,也不会造成多少麻烦。只要多实例化几个对象就是了。
CoolQ
2006-10-20
打赏
举报
回复
To: iambic()
其实用全局变量并不代表滥用
你说的封装成对象,虽然可以,但是模块层次比较深的时候,你的这个对象需要从一个模块儿传到另一个模块儿,还不如os.environ['var_map'] = { 'a': 1, 'b': 2 }呢
iambic
2006-10-20
打赏
举报
回复
#mod1.py
import mod2
import mod3
class Vars:
def __init__(self):
self.foo = 'bar'
self.bar = 'barbar'
self.foobar = 'foobar'
var = Vars()
if __name__ == '__main__':
mod2.foo()
mod2.bar()
mod3.printFoobar(var)
#mod2.py
import mod1
var = mod1.var#作为全局变量
def foo():
print var.foo
def bar():
print var.bar
print var.foobar
#mod3.py
def printFoobar(vars_obj):#做为对象传递
print vars_obj.foo
print vars_obj.bar
print vars_obj.foobar
xyzxyz1111
2006-10-20
打赏
举报
回复
#在mod2.py 里
...
def foo(d):
var_1 = ... # 新的值
...
d.update(locals())
#mod1.py 里
...
mod2.foo(globals())
...
CoolQ
2006-10-20
打赏
举报
回复
>>如果你按我说的,只把这个对象设成全局的,就可以减少全局变量,也不用频繁传递了。
怎么把对象设成全局?
iambic
2006-10-19
打赏
举报
回复
即使全局变量,引用的时候一般也是带模块名,比如mod1.foo。不如封装成使用对象,然后再需要的时候vars = mod1.vars。
引用的时候就用vars.foo。使用起来或者传递起来都方便,又封装,有利于代码结构。
我还是坚持减少全局变量。
CoolQ
2006-10-19
打赏
举报
回复
michael_g_hu(一代风云)的方法不错,不过environ的大小是有限的,因此全局变量这么做会有一些限制
pdvv(我爱花猫)的方法似乎不管用
pdvv
2006-10-19
打赏
举报
回复
全局变量保存在单独的global_setting.py中,需要使用时再导入:
from global_setting import *
michael_g_hu
2006-10-19
打赏
举报
回复
你可以把这些变量放到环境变量中,用os.environ[key]获得,修改,其他文件同样可以这样做
iambic
2006-10-18
打赏
举报
回复
仔细判断到底这个变量需要声明在哪里。
另外,不要搞这多全局变量,尽量包装成对象或Hash。这样传递起来方便。
CoolQ
2006-10-18
打赏
举报
回复
那如果mod1的全局变量需要被mod2和mod3都调用该怎么办?你这一招就不灵了
CoolQ
2006-10-18
打赏
举报
回复
既然提到全局变量,那肯定是有两个以上的模块需要访问
之所以不想通过参数传递变量,是因为当模块的包含关系层次比较深入时,这些变量不得不从一个模块儿传到另一个模块,非常的不方便,而且本来是var_foo的访问却要写成arg_hash['var_foo']. 可能Python的理念就是模块的独立吧。
还有啥别的建议么?
iambic
2006-10-17
打赏
举报
回复
传参数。如果mod1的全局变量太多,而又都需要被mod2调用,那就请你直接把这些变量声明在mod2中。
爱上axure之 交互制作
1,本章节会给大家分享Axure的所有交互动作,从链接、元件、
全局变量
,中继器、其他五大类进行分享。 2,每节课将会,以内容介绍+功能解释+案例演示,三个步骤进行讲解,让大家能从根本理解课程的内容。 3,课程前三...
Python中的
全局变量
在本文章中,我们来讨论一下python中的
全局变量
,我们将学习如何定义
全局变量
,然后如何在函数中
访问
它们,以及如何在函数中修改
全局变量
的值。
全局变量
: python的代码结构一般按照shebang、import模块、全局...
python中
全局变量
与局部变量
局部变量就是定义在
一个
函数体内部的变量
全局变量
是定义在外面的变量 比如: a = 1 def f(): b = 2 其中a就是
全局变量
,而b是局部变量。局部变量只在函数体内部有效,出了函数体,外面是
访问
不到的,而
全局变量
...
python
访问
全局变量
_PYTHON之
全局变量
不同的模块都可以自由的
访问
全局变量
,可能会导致
全局变量
的不可预知性。对
全局变量
,如果程序员甲修改了_a的值,程序员乙同时也要使用_a,这时可能导致程序中的错误。这种错误是很难发现和更正的。
全局变量
降低了...
python函数中的
全局变量
访问
修改
问题
2、即便函数内部对
全局变量
进行赋值操作,那也会被python当做是
一个
新的与
全局变量
同名的局部变量。4、只有当在函数内部用global关键字显示的声明该变量是
全局变量
,才可以在函数内部对该
全局变量
进行正确的自增自减...
脚本语言
37,719
社区成员
34,238
社区内容
发帖
与我相关
我的任务
脚本语言
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
复制链接
扫一扫
分享
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
试试用AI创作助手写篇文章吧
+ 用AI写文章