zoukankan      html  css  js  c++  java
  • 跨模块全局变量的使用问题

    一. 使用 from p import *  会影响全局变量使用

    a.py 文件

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

    p.py 文件

    from a import *
    func1()
    print "PWD after call func1() is: " + str(PWD)

    执行p.py文件

    执行 python b.py 结果如下
    PWD in func1 is: pwd
    PWD after call func1() is: None

    上述结论:认为在函数中给全局变量的赋予的值, 并不能传递回去, 就是说global PWD 只是把全局变量的传递给局部变量 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

    -------------------------------------------------------------------------------------------------------

    但如果全局变量是 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

    -- b.py -- 甚至可以不用 global GLIST

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

    这就好比虽然 GLIST只读, 但它的仿佛是个指针, 指向的位置却可写

    结论: 

    最好不要使用 "from a import *" 否则对对全局变量赋值在其他module中不能使用. ( 最好用 import a, 在其他 module 通过 a.gvar 使用)

    另外值得一提的是: 如果只是读取全局变量( 不修改), 并不需要用 global 再申明, 直接使用就可以了

    1. def func1():
    2.  
      GLIST[0] = "glist changed"
  • 相关阅读:
    oracle11g 卸载和安装(win7,32位)
    MySQL忘记密码解决办法
    GPIO硬件资源的申请,内核空间和用户空间的数据交换,ioctl(.....),设备文件的自动创建
    模块参数,系统调用,字符设备编程重要数据结构,设备号的申请与注册,关于cdev的API
    开发环境的搭建,符合导出,打印优先级阈值
    定时器中断
    Linux系统移植的重要文件
    linux 相关指令
    linux各文件夹含义和作用
    外部中断实验
  • 原文地址:https://www.cnblogs.com/xiaozengzeng/p/12900152.html
Copyright © 2011-2022 走看看