python 引入并修改模块全局变量问题

为了方便全局变量的管理, 一般将全局变量放到一个单独的。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

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃肉夹馍不要夹馍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值