python全局变量


  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)定义类属性

      类属性使用时的内存情况如下图所示,由于调用时,不同文件使用相同类的类属性地址指针都指向同一个地址,所以类的属性是共享的

    python全局变量

 

 

     代码实现如下:

    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

(0)
上一篇 2022年8月6日
下一篇 2022年8月6日

相关推荐

发表回复

登录后才能评论