一个全局变量访问的问题

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 打赏 收藏 转发到动态 举报
写回复
用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中。

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧