python项目开发过程中,需要使用全局变量操作,缓存记录、数据共享等功能都需要全局变量的功能才得以实现,下面简单介绍下当前文件
与不同文件之间的全局变量设置与操作。
介绍当前文件的全局变量前,先介绍下变量的作用域
def a(): ## 局部变量 local = 1 print(local) ## 全局无法使用,只有自己可用 print(lobal)
global_str = '123' def a(): ## 全局变量 print(global_str) ## 全局变量大家都可以用 print(global_str)
系统内固定模块里定义的变量,如预定义在builtin 模块内的变量。这里不介绍了。
一般在定义类(class)中应用较多,定义方法较少使用
def out(): ## 函数内变量,但对于下级函数就是全局变量,对于外部来说就是局部变量 en = 1 def inside(): print(en) return en return inside() out()
代码如下:
if 1==1:
name="Alex"#在java中不可以打印出来但是在Python中是没有块作用域,它还在外面生效
print(name)#在javasript也是可以打印的,在Python中也可以打印
代码如下:
def fun1(): name="Alex" # print(name)会报错,超出了name的作用域
name="Alex" def f2(): name="eric" def f3(): print(name)#从里面向外面找 f3() f2()
n="Alex" def fu(): print(n)#从里到 外找,跟fu这个函数放在哪里是没有关系的 def f1(): n="AJ" fu() f1()
在定义的类中或者是函数中想要对全局变量进行操作需要使用使用global进行修饰,案例如下:
# 定义一个全局变量 num = 99 class Demo(): @classmethod def add(cls, t=None): global num num += t print('class:', num) def fun(n=None): global num num += n print('fun', num) demo = Demo() demo.add(1) print(num)
结果:
class: 100
100
fun 101
101
注:global只能在函数内使用
通过import包导入的方式式引用指定文件的全局变量进行操作。不要使用from import的方式引用,此方式只可读取变量,不能操作变量
a.py文件:
# 定义一个全局变量 num = 100
b.py文件:
import a def b_add(): a.num += 2
c.py文件:
import a def c_add(): a.num += 1
d.py文件:
import a import b import c b.b_add() c.c_add() print(a.num)
结果显示:
103
类属性使用时的内存情况如下图所示,由于调用时,不同文件使用相同类的类属性地址指针都指向同一个地址,所以类的属性是共享的
代码实现如下:
a文件:
class Demo(): share_list = []
b文件:
import threading import a def f1(): a.Demo.share_list.append(1) def f2(): a.Demo.share_list.append(2) threading.Thread(target=f1).start() threading.Thread(target=f2).start() print(a.Demo.share_list)
输出结果:
[1, 2]