在python编程中,一般使用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.py 和 main.py ,data_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:
distance in class: 90

两次运行的结果存在出入,可以发现,用global 在不同文件间操作全局变量时,生成的结果和我们想象的不太一样,具体原因还不明确??知道原因的欢迎留言。

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

第一个文件(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

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

python程序中用类变量代替global 定义全局变量的更多相关文章

  1. PHP Global定义全局变量使用说明

    Global是php中一个比较特殊的命令,大家直接叫他超级全局变量了,下面我来介绍我今天在使用Global定义全局学习笔记了   很不习惯PHP中的变量作用域,PHP中函数变量和全局是完全隔绝的,也就 ...

  2. CodeIgniter 定义“全局变量-global variable”,可以在所有controller,model和view中使用

    本文抄自http://www.cnblogs.com/webu/archive/2012/11/20/2779999.html 第一次正儿八经用CodeIgniter框架做项目,结果不会定义全局变量, ...

  3. $_GLOBALS超全局数组和global定义的全局变量区别?

    全局变量:主程序中定义的变量(函数外部),只能在主程序中使用,在函数内部不能调用 背景:解决在函数内部调用全局变量的问题 解决方法: 1.在函数内部声名全局变量 <?php public $va ...

  4. 解释器、环境变量、如何运行python程序、变量先定义后引用

    python解释器的介绍.解释器的安装.环境变量的添加为什么加环境变量.如何调取不同的解释器版本实现多版本共存.python程序如何运行的.python的变量定义 一.python解释器: 用来翻译语 ...

  5. python学习Day13 函数的嵌套定义、global、nonlocal关键字、闭包及闭包的运用场景、装饰器

    复习 1.函数对象:函数名 => 存放的是函数的内存地址1)函数名 - 找到的是函数的内存地址2)函数名() - 调用函数 => 函数的返回值 eg:fn()() => fn的返回值 ...

  6. Python 程序员经常犯的 10 个错误

    关于PythonPython是一种解释性.面向对象并具有动态语义的高级程序语言.它内建了高级的数据结构,结合了动态类型和动态绑定的优点,这使得... 关于Python Python是一种解释性.面向对 ...

  7. Python程序员的10个常见错误(转)

    add by zhj:虽然学Python也有两年了,但这些问题的确容易犯,看来对Python的理解还有些地方不深入.先转了,有时间再好好看 译文:http://blog.jobbole.com/682 ...

  8. Python程序的常见错误(收集篇)

    关于Python Python是一门解释性的,面向对象的,并具有动态语义的高级编程语言.它高级的内置数据结构,结合其动态类型和动态绑定的特性,使得它在快速应用程序开发(Rapid Applicatio ...

  9. Python程序员的10个常见错误

    关于Python Python是一门解释性的,面向对象的,并具有动态语义的高级编程语言.它高级的内置数据结构,结合其动态类型和动态绑定的特性,使得它在快速应用程序开发(Rapid Applicatio ...

随机推荐

  1. 《计算机图形学基础(OpenGL版)》使用院校(更新)

    从清华大学出版社责任编辑处获悉,很多高等院校选用了我们这本教材,读者反应不错! 另外,编辑提供了一份详细的使用院校名单如下: 河南科技学院 中原工学院 河北工程大学 防空兵学院 伊犁师院电信学院 吉林 ...

  2. PKCS #1 RSA Encryption Version 1.5 填充方式

    在进行RSA运算时需要将源数据D转化为Encryption block(EB).其中pkcs1padding V1.5的填充模式安装以下方式进行 (1) EB = 00+ BT+PS +00 + D ...

  3. Shell 环境变量也是变量

    跟定义普通变量一样,语法是 变量名=值,只不过这个名字叫 PATH,值是路径 shell PATH=/usr/local/python-2.7.6/bin 导入的话使用export命令 shell e ...

  4. C#写上位机中写曲线图的知识点(VS2019-WPF)

    最近在写一个上位机,为了与下位机软件串口进行通信以及一些数据的形象显示,做到曲线图这一块的时候出现了一些问题,我用的是VS2019(个人不能吐槽VS2019新版本,因为平时也很少用VS,下载的时候就直 ...

  5. 获取第n天日期

    function datezh(s){ return s = s>9 ? s:"0"+s } function dateTime(t){ var getNowTime = v ...

  6. jupyter notebook主目录修改

    转自http://blog.csdn.net/c437yuyang/article/details/54836303 1.打开 cmd 输入命令 jupyter notebook --generate ...

  7. 在 CentOS 7 上设置 grub2

    在 CentOS 7 上设置 grub2 1. 开机选单是自动创建出来的 请勿尝试手动编辑开机选单,因为它是按照 /boot/ 目录内的文件自动创建出来的.然而你可以调整 /etc/default/g ...

  8. 2、在1.VMware虚拟机上安装ubantu系统

    1.新建新的虚拟机系统 2.使用自定义高级安装 3.选择下一步操作 4.选择稍后安装 4.因为我们要安装的是Linux的发行版本ubuntu,所以这里选择Linux(L),版本是Ubuntu 64位, ...

  9. 【微软2017年预科生计划在线编程笔试 B】Tree Restoration

    [题目链接]:https://hihocoder.com/problemset/problem/1490 [题意] 给你一棵树的以下信息: 1.节点个数 2.给出树的每一层从左到右的顺序每个节点的编号 ...

  10. Nginx学习总结(1)——Nginx入门简介

    本文主要介绍一些Nginx的最基本功能以及简单配置,但不包括Nginx的安装部署以及实现原理.废话不多,直接开始. 1.静态HTTP服务器 首先,Nginx是一个HTTP服务器,可以将服务器上的静态文 ...