在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. ajax 三级联动写法

    主页面代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  2. set statistics profile on实例

    set statistics profile on实例 1.SQL语句实例   SQL 代码   复制 SET STATISTICS PROFILE ON GO SELECT COUNT(b.[Sal ...

  3. WEB笔记-5、字体和文本

    字体样式 font-family font-size font-weight font-style font-variant font(简写) 常用字体: serif,衬线字体,每个字符笔画末端会有装 ...

  4. Python之function

    1 Function a function is a device that groups a set of statements so they can be run more than once ...

  5. iproute2和tc的高级路由用法

    #Linux advanced router ip link show #显示链路 ip addr show #显示地址(或ifconfig) ip route show #显示路由(route -n ...

  6. uni-app强大的前端框架,h5,原生app(两大系统),微信小程序

    最近发现一款强大的前端框架,它叫uni-app 这是一款通用的框架可以打包app,h5,微信小程序, 说说要弄这个工具需要会那些技能吧, 要熟悉vue,微信小程序.这样这个框架用的就是很快上手了 模块 ...

  7. 用批处理实现垃圾文件清除/自动关机/清除copy病毒

    晚上睡觉之前为了下emule经常使用命令shutdown,最近受一个小程序影响想做个自动关机的批处理文件免的麻烦!网上有高手做了个,不过运行时出 现一个绑定错误,at也不能执行,所以后来自己做了简化版 ...

  8. 再谈应用环境下的 TIME_WAIT 和 CLOSE_WAIT

    转自:http://blog.csdn.net/shootyou/article/details/6622226 昨天解决了一个 HttpClient 调用错误导致的服务器异常,具体过程如下: htt ...

  9. Modbus串行通信

    一.Modbus通信协议简介 1. Modbus协议 Modbus 是一个请求/应答协议,并且提供功能码规定的服务.Modbu协议是 OSI 模型第 7 层上的应用层报文传输协议. MODBUS协议支 ...

  10. nyoj29-求置转换问题

    求转置矩阵问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 求一个三行三列的转置矩阵. 输入 第一行一个整数n<20,表示有n组测试数据,下面是n组数据;每组测 ...