Chinaunix

标题: 关于跨模块的全局变量的使用 [打印本页]

作者: chrisyan    时间: 2007-05-31 17:39
标题: 关于跨模块的全局变量的使用
大家都知道这样使用全局变量是可以滴
a=1

def m(b):
    global a
    a=b

m(2)
print a

这样a就变成2了.
但是现在我是这样的,我的变量和函数定义在另外一个文件中(utils.py),我在主控脚本(main.py)中调用 比如:
main.py:

from utils import *

print a
print b
modify(5,6)

print a
print b

utils.py:
a=1
b=2

def modify(c,d):
    global a
    a=c
    global b
    b=d

这样怎么就不行了呢?
有没有人知道啊,如果像from ... import * 所说的,直接导入本地,这样应该是可以的啊
作者: niexining    时间: 2007-05-31 18:48

  1. from utils import *

  2. def modify(c,d):
  3.     global a
  4.     a=c
  5.     global b
  6.     b=d

  7. print a
  8. print b
  9. modify(5,6)

  10. print a
  11. print b
复制代码

作者: limodou    时间: 2007-05-31 19:21
global几模块级的,不能跨模块使用。
作者: chrisyan    时间: 2007-05-31 21:28
多谢modou兄,偶知道了

回niexining
其实我是不想这样用的,我是想把变量和函数都放到另外一个文件中去的
其实我的实际情况是这样的
我有两个脚本,需要的参数几乎一样的,在文件的开始我定义了这些变量的初时值,下面用getopt来获取参数,然后改这些值,结果好大一段都是一样的,我就想写成函数(getopt部分),如果可以像我说的那样,我把这些初时变量和函数放到另外一个utils.py中,在这边只掉一下函数就可以了,现在我只能把初时变量传进去,在把改过的传出来,我有十几个变量,比较麻烦,又想公用,所以就有了这样的想法.


谢谢二位了
作者: limodou    时间: 2007-05-31 22:30
你的想法是可以的。不过不要使用from xx import yy这种形式,而是使用import xx.然后就可以通过xx.yy来使用,然后xx.yy='abc'可以进行修改。这样都这样处理全局性的变量就可以共享的。也就是保持一个独立的namespace,这样python不会再次导入,从而实现共享。
作者: niexining    时间: 2007-06-01 12:24
  1. #main.py

  2. import utils

  3. print utils.a
  4. print utils.b
  5. utils.modify(5,6)

  6. print utils.a
  7. print utils.b

  8. #utils.py

  9. a=1
  10. b=2

  11. def modify(c,d):
  12.     global a
  13.     a=c
  14.     global b
  15.     b=d
复制代码


我帮你试了非常ok
虽然不懂limodou说的“不会再次导入namespace ”,
但又学到一点东西
作者: limodou    时间: 2007-06-01 13:11
意思就是说一个模块一般只会导入一次,比如你多次执行:

import a
import a
import a

但其实只有第一次会导入进来。如果真正想重新导入,那么可以在第一次import a之后,通过reload(a)再次导入。
作者: yeqiufeng    时间: 2007-06-04 21:09
长见识了。有点持久层的味道。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2