python程序中用类变量代替global 定义全局变量(详细教程)

python程序中用类变量代替global 定义全局变量(详细教程)

Python编程,在类的def函数之间进行参数传递,可以采用队列、全局变量、类变量等方法

一般情况下,使用global 关键字来定义全局变量,但是发现 global 关键字在涉及多个文件时,好像存在问题。

比如,单个文件下用global定义使用全局变量的情况 ,看下面的代码

# -*-coding: utf-8 -*-
#from data_def import *
distance=34

class test(object):
    def __init__(self):
       pass
    #在类里面改变全局变量的值
    def change_1(self):
        global distance
        distance=90
        print("distance in class:", distance)

    #输出全局变量的值
    def print_value(self):
        global distance
        print("distance in class:", distance)

#在函数里面使用和打印全局变量的值
def function_test():
    global distance
    print("global value in function", distance)
    distance=234
    print("global value in function",distance)

function_test()  #在函数里面使用和改变全局变量的值 34->234
t=test()
t.print_value()  #在类里面打印全局变量的值 234
t.change_1()   #在类里面改变全局变量的值 234->90

程序运行结果如下:全局变量运行正确

global value in function 34
global value in function 234
distance in class: 234
distance in class: 90

下面把上述代码拆分成两个文件,data_def.pymain.pydata_def.py 定义全局变量distance 和类 ,main.py 导入data_def.py

data_def.py文件代码如下:

# -*-coding: utf-8 -*-
distance=34
class test(object):
    def __init__(self):
       pass
    #在类里面改变全局变量的值
    def change_1(self):
        global distance
        distance=90
        print("distance in class:", distance)

    #输出全局变量的值
    def print_value(self):
        global distance
        print("distance in class:", distance)

main.py文件代码如下:

# -*-coding: utf-8 -*-
from data_def import *
#在函数里面使用和打印全局变量的值
def function_test():
    global distance
    print("global value in function", distance)
    distance=234
    print("global value in function",distance)

print("gloabl value in main:",distance)  #主函数里面,全局变量为34
function_test()  #在函数里面使用和改变全局变量的值 34->234
t=test()
t.print_value()  #在类里面打印全局变量的值 输出为 34 并非是234,函数里面改变全局变量值不影响类里面全局变量的值???
t.change_1()   #在类里面改变全局变量的值 34->90

程序运行结果:

gloabl value in main: 34
global value in function 34
global value in function 234
distance in class: 34
distance in class: 90

两次运行的结果存在出入,可以发现,用global 在不同文件间操作全局变量时,生成的结果和我们想象的不太一样(也就说在main.py中变量distance已经发生改变,但是回到data_def.py中进行运行,显示distance仍然为原来的数值)。

为此,可以考虑用类变量来定义全局变量。实现方式看以下代码。

第一个文件(data_def.py)定义两个类,第一个类定义全局变量distance ,第二个类为普通操作类

# -*-coding: utf-8 -*-
#filename:data_def.py
#构造类变量作为全局变量,代替global
class global_value():
    distance=34

class test(object):
    def __init__(self):
       pass
    #在类里面改变全局变量的值
    def change_1(self):
        global_value.distance=40
        print("distance in class:", global_value.distance)

    def change_2(self):
        global_value.tail_dis=90
        print("distance in class:",global_value.distance)

    #输出全局变量的值
    def print_value(self):
        print("distance in class:", global_value.distance)

第二个文件(main.py) 导入第一个文件定义的类,并进行变量操作

# -*-coding: utf-8 -*-
from data_def import *

#在函数里面使用和打印全局变量的值
def function_test():
    print("global value in function", global_value.distance)
    global_value.distance=234
    print("global value in function",global_value.distance)

print("global value in main:",global_value.distance)   #打印出全局变量的初始值:34
t=test()
t.change_1()                                           #在类里面改变全局变量的值:34->40
print("global value in main:",global_value.distance)
t.change_2()                                           #在类里面改变全局变量的值:40->90
print("global value in main:",global_value.distance)
function_test()                                        #在自定义函数里面使用和改变全局变量的值 90->234
global_value.distance=11                               #在main主函数里面改变全局变量的值 234->11
t.print_value()                                        #在类里面查看已经改变的全局变量的值 11

程序输出结果如下:

global value in main: 34
distance in class: 40
global value in main: 40
distance in class: 40
global value in main: 40
global value in function 40
global value in function 234
distance in class: 11

从输出结果可以看出,利用类变量的方式也可以实现全局变量的定义,并且可以跨文件操作。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2130.html原文链接:https://javaforall.net

(0)
上一篇 2020年11月8日 下午9:33
下一篇 2020年11月8日 下午9:33


相关推荐

  • jetty和tomcat区别

    jetty和tomcat区别Jetty 和 Tomcat 为目前全球范围内最著名的两款开源的 webserver servlet 容器 由于它们的实现都遵循 JavaServlet 规范 一个 javaWeb 应用部署于两款容器的任意一个皆可 但选择哪个更优 也许这得看场景 近期很多人关注 Jetty 也许主要是因为 GAE 放弃了 Tomcat 而选择了 Jetty 于是 以很直接的想法 Jetty 更符合 GAE 的需求 即云环境的需求 亦分布式

    2026年3月16日
    1
  • 计算机科学和电子信息学报,太赫兹科学与电子信息学报

    计算机科学和电子信息学报,太赫兹科学与电子信息学报太赫兹科学与电子信息学报 双月刊 创刊于 2003 年 是由中国工程物理研究院主管 中国工程物理研究院电子工程研究所主办 四川省电子学会协办的国内外公开发行的学术期刊 经国家新闻出版总署批准 信息与电子工程 于 2013 年 1 月起更名为 太赫兹科学与电子信息学报 国内外公开发行 主管单位为中国工程物理研究院 主办单位为中国工程物理研究院电子工程研究所 协办单位为中国兵工学会太赫兹应用技术专业委员会

    2026年3月19日
    3
  • android模拟器加速,配置android模拟器加速(虚拟化加速)

    android模拟器加速,配置android模拟器加速(虚拟化加速)使用 android 官网的配置虚拟机加速的技术能使得模拟器达到甚至超越真实的手机运行速度 也能大大提高工程部署速度 本文引用地址 http www eepw com cn article 201610 305387 htm 具体实现步骤 1 安装虚拟化驱动 打开 AndroidSDKMa gt selectExtras gt IntelHardwar

    2026年3月26日
    2
  • 20191009 3. 史上最全的USB-PD充电协议,包含PD协议波形图

    20191009 3. 史上最全的USB-PD充电协议,包含PD协议波形图USB PD PowerDeliver 是基于 USBType C 的一种电源供电标准 最大供电功率可达 100 瓦 W 随着 USBType C 的普及 越来越多的设备 手机 平板 显示器 工作站 充电器等 使用 USB PD 快速充电方案 1 USBType C 简介 Type C 是 USB 接口的一种形式 不分正反两面均可插入 支持 USB 标准的充电 数据传输 视频传输 音频传输 显示输

    2026年3月20日
    2
  • oracle 分页查 limit,关于Oracle分页查询

    oracle 分页查 limit,关于Oracle分页查询MySql 分页 select frombiaoming start num2 size Oracle 分页 关键字 rownumselect rownumfromem selectename rownumfrom select fromemp 三层过滤 效率较高 selec

    2026年3月18日
    2
  • oracle 查看服务器密码修改,如何修改oracle用户密码「建议收藏」

    oracle 查看服务器密码修改,如何修改oracle用户密码「建议收藏」修改oracle用户密码的方法:首先连接oracle数据库所在服务器,并进入oracle控制台;然后输入“selectusernamefromdba_users”查看用户列表;最后输入修改用户口令即可。本教程操作环境:windows7系统、oracle版,DELLG3电脑。修改oracle用户密码的方法:1、用CRT以安装oracle数据库的用户连接oracle数据库所在服务器。(以服务…

    2022年7月28日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号