美文网首页思科DevNet
PYTHON多模块文件共享变量

PYTHON多模块文件共享变量

作者: 晓函 | 来源:发表于2016-05-23 01:23 被阅读0次

    首先,在python,
    5文件,共享变量x存在glovar.py里面,需要在任意模块都能更改,更改后任意模块获取到的值都相同,这就是多模块文件共享一个变量

    #5个文件的路径
    c:\test\main.py
    c:\test\show.py
    c:\test\test.py
    c:\test\common\__init__.py #空文件
    c:\test\common\glovar.py
    c:\test\common\calc.py
    
    #glovar.py
    x = 1
    
    #show.py
    from comon import glovar
    class Show:
      def showchange(self):
        if glovar.x!=1:
          print 'show x change'
        else:
          print 'show x=1'
    
    #test.py
    from comon.glovar import x
    class Test:
      def testchange(self):
        if x!=1:
          print 'test x change'
        else:
          print 'test x=1'
    
    #calc.py
    import glovar
    class Calc:
      def add(self):
        glovar.x+=1
    
    #main.py
    from comon import glovar
    
    c = Calc()
    c.add()
    
    s = Show()
    s.showchange()
    
    t = Test()
    t.testchange()
    

    运行main.py

    #输出
    show x change
    test x=1
    

    上面这些文件,除了test.py失败,其他文件都能共享变量能成功,是因为python的命名空间相同,靠的就是import用正确
    来看看这三种不同

    import glovar
    from comon import glovar
    from common.glovar import x
    

    Python import 包的机制是,import进来的和默认的系统的module了,都放在sys.module这个字典里面.
    多个py文件再次import的时候,会先去sys.module里面检查是否已经import了,如果已经import了,就不再重复import,否则就import进来

    ===

    import glovar和from comon import glovar的命名空间是一样的,key都是glovar

    from common.glovar import x 则不一样,test.py中这样from import,就相当于在test.py文件中写了一行代码x = 1,
    此时x就是test自己命名空间中的变量。所以x只在test.py中有效,无聊自己如何对x修改,都无法影响glovar 中的x

    #换种说法
    from glovar import x
    #等同于
    improt glovar
    x= glovar.x
    #你调用x的时候,就是自己的命名空间中的x
    #当你执行x=2时,完全影响不到glovar.x
    

    下面是解释

    #引入当前glovar文件,此时namespace是glovar
    import glovar
    
    #从common目录中引入glovar,此时namespace是glovar
    from comon import glovar
    
    #从common目录中的glovar文件中引入x=1,此时namespace就是引用者,也就是上面的test.py
    from common.glovar import x 
    

    所以,如果需要共享变量,就不要使用from file import x这种形式,而是使用import file,然后就可以通过file.x来使用,然后file.x='abc'可以进行修改。这样都这样处理全局性的变量就可以共享的。也就是保持一个独立的namespace,这样python不会再次导入,从而实现共享。

    相关文章

      网友评论

        本文标题:PYTHON多模块文件共享变量

        本文链接:https://www.haomeiwen.com/subject/mpkarttx.html