Python全局变量跨模块变量定义和使用

在同一个py脚本中,定义在所有函数之外的变量可以理解为全局变量,因为所有函数可以直接访问函数外的变量(但不能访问其他函数的私有变量),这里涉及到变量的作用域,一般分为函数作用域和全局作用域,函数作用域包含在全局作用域中,子作用域可以访问全局作用域的变量,全局作用域不能访问子作用域的变量。

(一)定义和访问

python全局变量定义在函数外部,在全局包括函数内作用域都可以访问。

public_str = 'a'
def show():
    # 打印结果a
    print(public_str)
show()
# 打印结果a
print(public_str)

(二)修改

全局变量的修改需要在修改前使用global声明该变量为全局变量,如果不使用global声明则python认为该变量为新定义的函数内局部变量。如果函数中既有访问又有修改,那么global声明应该在访问之前。

public_str = 'a'
def show():
    global public_str
    # 打印结果a
    print(public_str)
    public_str = 'b'
show()
# 打印结果b
print(public_str)

结论:引用全局变量,不需要golbal声明,修改全局变量,需要使用global声明。列表、字典等如果只是修改其中元素的值,可以直接使用全局变量,不需要global声明。

二、跨模块全局变量

跨模块全局变量不局限于单个py脚本使用,在python程序中所有运行的模块函数都可以访问和修改。python单个py脚本可以理解为一个模块,在py脚本中可以import加载使用多个模块,并且使用其中的函数功能。通过import加载的模块如果需要共用一个变量,那么就需要定义跨模块全局变量。

python中一个脚本多次import同一个模块,模块中的数据共用。例如a import b,cb import c,a作为主程序加载b模块c模块,b模块中再加载c模块,因为都由主程序开始加载因此内存资源是共用的,a和b中的c我们可以理解为同一个c。因此我们在python如果需要使用跨模块全局变量,可以在单独模块中进行定义,然后在需要的模块中import加载即可访问及修改。

下面演示在公共模块config中定义变量public_val,在main模块和app模块使用和修改:

1.config.py

public_val = 888

2.main.py

import config, app

print(f'main config.public_val:{config.public_val}')
app.hello('world')

def show():
    print(f'show config.public_val:{config.public_val}')
show()

2.app.py

import config

def hello(name):
    print(f'app.hello {name}')
    print(f'app.hello config.public_val:{config.public_val}')
    # 修改config模块中public_val变量
    config.public_val = 999

输出结果:

main config.public_val:888
app.hello world
app.hello config.public_val:888
show config.public_val:999

config.py为变量定义的模块,在main.pyapp.py中加载config.py访问其中的public_val变量。

你可能感兴趣的:(Python,python,开发语言,numpy)