• python 经验:把全局变量放在一个类中


    注:红色是我增加的注释

    add by zhj:其实python中的import, from-import语句是创建新的同名变量指向引入的模块和模块属性,这也就解释了下面的情况。

    我们应尽量不用全局变量,比如当一个模块中的两个函数要用同一个变量时,我们可以尝试把这两个函数写在一个类中,而该变量定义

    成类变量。如果非要用全局变量,建议把它们全部定义在一个类中,通过“类名.类变量名”来使用它们,这样OK了,根本不用什么globle

    关键字了。

    原文:http://www.2cto.com/kf/201307/227572.html

    --   a.py --
    PWD = None

    def func1():
        global PWD
        PWD="pwd"
        print "PWD in func1 is: " + PWD

    --   b.py --

    from a import *         #创建新变量PWD,func1,它们与a.py模块中的变量PWD,func1属性不同的名称空间,指向相同的对象,其实变量就是指针
    func1()                     #进入a.py模块的名称空间,修改a.py中PWD指针,指向新的对象
    print "PWD after call func1() is: " + str(PWD)  #a.py中PWD和b.py中的PWD是两个指针,指向同一个对象,a.py中的PWD指向了新的对象,这对b.py中的PWD无影响

    执行 python b.py 结果如下

    PWD in func1 is: pwd
    PWD after call func1() is: None

    刚开始我认为在函数中给全局变量的赋予的值, 并不能传递回去, 就是说
    global PWD 只是把全局变量的传递给局部变量 PWD, 而后用户都在对局部变量 PWD进行操作, 但并不是这样

    看下面例子, 只是改了 import 语句


    ---  b.py ---
    import a
    a.func1()
    print "PWD after call func1() is: " + str(a.PWD)

    输出变为

    PWD in func1 is: pwd
    PWD after call func1() is: pwd

    因此我推测 global 只能改本 module ( 此 py 文件 ) 中的全局变量


    a.py 增加一个函数

    ---  a.py ---
    PWD = None

    def func1():
        global PWD
        PWD="pwd"
        print "PWD in func1 is: " + PWD


    def func2():
        global PWD
        print "PWD in func2 is: " + PWD

    ---   b.py ---
    from a import *

    print dir()
    func1()
    func2()

    输出结果为

    PWD in func1 is: pwd
    PWD in func2 is: pwd

    貌似我的结论成立:

       global 只能改本 module ( 此 py 文件 ) 中的全局变量

     但如果全局变量是 list 或 dict 类型, 就没有问题

    ---  a.py ---
    GLIST = ["glist"]

    def func1():
        global GLIST
        GLIST[0] = "glist changed"

    ---   b.py ---
    from a import *

    print GLIST[0]


    运行  python b.py , 打印

    glist changed

    结论:

    最好不要使用 "from a import *" 否则你会发现不能对简单全局变量赋值

  • 相关阅读:
    java学习笔记05--字符串 .
    java学习笔记04--数组
    java学习笔记07--日期操作类
    java学习笔记14--动态代理
    java学习笔记09--反射机制
    java学习笔记06--正则表达式
    java学习笔记08--泛型
    java学习笔记10--枚举
    java学习笔记11--Annotation
    交叉熵代价函数
  • 原文地址:https://www.cnblogs.com/ajianbeyourself/p/3379077.html
Copyright © 2020-2023  润新知