python不能跨模块赋值

两个文件

# test1.py
a = True

def output_ab1():
    if a:
        print('test1.a', id(a))
    else:
        print('test1.b', id(a))
# test2.py
from test1 import a, output_ab1

def output_ab2():
    if a:
        print('test2.a', id(a))
    else:
        print('test2.b', id(a))

def change():
    # 使用global更改a的值
    global a
    print('old a', id(a))
    a = False
    print('new a', id(a))


if __name__ == '__main__':
    output_ab1()
    output_ab2()
    change()
    output_ab1()
    output_ab2()

以下是运行test2.py的输出:

test1.a 140717944724328
test2.a 140717944724328
old a 140717944724328
new a 140717944724360
test1.a 140717944724328
test2.b 140717944724360

test2.py中global声明后,对a的赋值操作只是改变了test2中a的引用,而test1中函数引用的仍然是原来的a。

第三个文件和它运行的输出:

# test3.py
import test2

test2.output_ab2()
test2.change()
test2.output_ab2()
test2.a 140717944724328
old a 140717944724328
new a 140717944724360
test2.b 140717944724360

test3中调用change方法,可以成功赋值test2中的a。

某个作用于全局的变量赋值操作(改变引用地址),只能影响它所在的模块。
从其他模块引用过来的函数内部如果用到了这个变量(不以传参的形式),引用的仍是该变量在其所在模块的地址。

想要跨模块改变这类函数的行为,就不能用赋值操作。即不能改变变量的地址引用。
可变对象可以在内部元素发生变化时,引用地址不变。所以能够将改变应用到所有模块。

因此把a改为一个类实例:

# test1.py
class A(object):
    def __init__(self):
        self.v = True
    
    def change(self):
        self.v = False
    
    def __bool__(self):
        return self.v

a = A()
# test2.py
...
# 仅改写change
def change():
    global a
    a.change()
...
test1.a 2558062160592
test2.a 2558062160592
old a 2558062160592
new a 2558062160592
test1.b 2558062160592
test2.b 2558062160592

a的引用地址没变化,但是实例a的属性值变了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值