两个文件
# 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的属性值变了。