[Python]_[初级]_[关于如何使用全局变量的问题]

本文详细对比了Python、C++和Java三种语言中全局变量的使用方式,包括Python基于模块的全局变量特性,C++中通过头文件和动态库实现全局变量的跨文件和跨库引用,以及Java由于类加载机制不存在传统意义上的全局变量。并通过具体代码示例展示了Python全局变量的使用场景。

场景

1.在做python开发时, 有时候会用到全局变量, 比如某个配置需要影响到程序的生命周期, 或者多线程程序里, 需要判断某个变量是True, 从而知道需要停止任务执行.

2.C++的全局变量只需要在头文件里声明一个extern int gTime;即可, 之后在.cpp里定义变量即可. 之后其他文件如果需要用到这个变量, 就包含这个头文件即可. 如果需要跨动态库使用的话, 还需要单独编译一个带extern int GetTime()的动态库才行, 之后其他库只需要调用这个导出函数GetTime的动态库即可.

3.Java是基于类加载机制的, 同一个类可以通过不同的代理多次加载, 所以没有全局变量.

说明

1.python全局变量是基于模块的, 因为每个模块只有一个实例. 在声明全局变量时, 只需要在需要全局使用的.py文件里A.py声明一个全局变量即可.x = False,之后导入import A, 并对A.x = True赋值。按照docs.python.org的说明, 使用的时候都不需要声明global x, 只需要全模块路径即可.

例子

文件的层次关系:

1.src/gui/utility.py


gIsStop = False

2.src/gui/window/test_global2.py


import src.gui.utility

def GetGlobal():
    print (__file__)
    return src.gui.utility.gIsStop

def SetGlobal(value):
    src.gui.utility.gIsStop = value

3.src/test_global1.py


import src.gui.utility
import importlib
from src.gui import utility
import _thread
import time

def worker():
    test_global2 = importlib.import_module('src.gui.window.test_global2')
    print(test_global2.GetGlobal())
    test_global2.SetGlobal(False)
    print(__file__)
    print(src.gui.utility.gIsStop)

if __name__ == "__main__":
    print (__file__,)
    print (src.gui.utility.gIsStop)
    utility.gIsStop = True

    _thread.start_new_thread(worker, ())
    time.sleep(10)

输出:

E:/Project/Sample/test-python/src/test_global1.py
False
E:\Project\Sample\test-python\src\gui\window\test_global2.py
True
E:/Project/Sample/test-python/src/test_global1.py
False

参考

How do I share global variables across modules?

visibility-of-global-variables-in-imported-modules

python-dynamic-import-how-to-import-from-module-name-from-variable

globals()
Return a dictionary representing the current global symbol table. This is always the dictionary of the current module (inside a function or method, this is the module where it is defined, not the module from which it is called).
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白行峰 (花名)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值