为了方便全局变量的管理, 一般将全局变量放到一个单独的。py文件中, 对于其中一些逻辑控制类变量, 比如 一个全局变量文件 const.py, 一个文件a.py 修改了const.py 中一些变量值, 希望在另一个文件 b.py中读取到更改,并且做出相应的逻辑处理
实际上是python中值类型和引用类型的问题
值类型包括:数字,布尔,字符串等
而引用类型包括:列表,字典等
在a.py中对值类型的修改,在b.py中是看不到的, 引用类型和实例化的对象(如单例)则相反
举例
const.py:
NUM =1
BOO = False
SS = "a string"
li = [1,2,3]
class Cons:
def __init__(self) -> None:
self._name = "name"
self.num = 1
self.li = [1,2,3]
def changeN(self, cs):
self._name = cs
def changeNum(self):
self.num += 1
def print_attr(self):
print(f"Cons name: {self._name}, num: {self.num}, list: {self.li}")
CONS = Cons()
a.py
from const import NUM, SS, BOO, CONS, li
def print_a():
global NUM,BOO,SS
print(f"a before: \
num: {NUM}, ss: {SS}, boo: {BOO}, li: {li}")
print("a before cons: ")
CONS.print_attr()
NUM +=1
SS += "dd"
BOO = not BOO
li.append('a')
CONS.changeN("change by a")
CONS.changeNum()
print("a chenge after......")
print(f"a after: \
num: {NUM}, ss: {SS}, boo: {BOO}, li: {li}")
CONS.print_attr()
b.py
from const import NUM, SS, BOO, CONS, li
from a import print_a
if __name__ == "__main__":
print(f"b before: \
num: {NUM}, ss: {SS}, boo: {BOO}, li: {li}")
NUM += 1
SS += "bb"
BOO = not BOO
CONS.changeN("change by b")
CONS.changeNum()
print("b chenge after......")
print(f"b after: \
num: {NUM}, ss: {SS}, boo: {BOO}, li: {li}")
CONS.print_attr()
print("------------a------------")
print_a()
运行结果:
b before: num: 1, ss: a string, boo: False, li: [1, 2, 3] # 原值
b chenge after......
b after: num: 2, ss: a stringbb, boo: True, li: [1, 2, 3] # b中进行了修改
Cons name: change by b, num: 2, list: [1, 2, 3]
------------a------------
a before: num: 1, ss: a string, boo: False, li: [1, 2, 3] # a中无法看到修改
a before cons:
Cons name: change by b, num: 2, list: [1, 2, 3] # 但是对于 引用类型可以看到
a chenge after......
a after: num: 2, ss: a stringdd, boo: True, li: [1, 2, 3, 'a']
Cons name: change by a, num: 3, list: [1, 2, 3]
Process finished with exit code 0