python项目开发过程中,需要使用全局变量操作,缓存记录、数据共享等功能都需要全局变量的功能才得以实现,下面简单介绍下当前文件
与不同文件之间的全局变量设置与操作。
一、当前文件内全局变量
1、变量的作用域说明
介绍当前文件的全局变量前,先介绍下变量的作用域
1)局部变量
def a(): ## 局部变量 local = 1 print(local) ## 全局无法使用,只有自己可用 print(lobal)
2)全局变量
global_str = '123' def a(): ## 全局变量 print(global_str) ## 全局变量大家都可以用 print(global_str)
3)内置作用域
系统内固定模块里定义的变量,如预定义在builtin 模块内的变量。这里不介绍了。
4)嵌套作用域
一般在定义类(class)中应用较多,定义方法较少使用
def out(): ## 函数内变量,但对于下级函数就是全局变量,对于外部来说就是局部变量 en = 1 def inside(): print(en) return en return inside() out()
2、作用域使用情况
1)Python当中没有块级的作用于:
代码如下:
if 1==1:
name=”Alex”#在java中不可以打印出来但是在Python中是没有块作用域,它还在外面生效
print(name)#在javasript也是可以打印的,在Python中也可以打印
2)Python中的作用于是以函数为作用域的。
代码如下:
def fun1(): name="Alex" # print(name)会报错,超出了name的作用域
3)在Python中作用域先找它自身函数的,然后再往外找,Python中是有作用域链的
name="Alex" def f2(): name="eric" def f3(): print(name)#从里面向外面找 f3() f2()
4)Python的作用域是在执行之前就已经确定下来的,如果要执行就去原来的作用域找就可以了
n="Alex" def fu(): print(n)#从里到 外找,跟fu这个函数放在哪里是没有关系的 def f1(): n="AJ" fu() f1()
3、当前文件的全局变量
在定义的类中或者是函数中想要对全局变量进行操作需要使用使用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只能在函数内使用
4、文件间的全局变量
1)定义文件中的全局变量
通过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
2)定义类属性
类属性使用时的内存情况如下图所示,由于调用时,不同文件使用相同类的类属性地址指针都指向同一个地址,所以类的属性是共享的
代码实现如下:
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]
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/279237.html