import xxx和from xxx import xx中修改被导入模块里面的变量的坑
程序员文章站
2022-03-26 12:29:46
现在有如下几个模块: A.py 功能:定义全局变量,供其他模块使用 B.py 功能:打印A.py中的变量 main.py 运行后我们发现: A模块中的name被修改了,但在B模块中打印的还是原来的值。 A模块中的lists添加了新的元素,显示正常。 原因: 使用from A import name ......
现在有如下几个模块:
a.py
功能:定义全局变量,供其他模块使用
name = "张三" lists = [1, 2, 3, 4, 5]
b.py
功能:打印a.py中的变量
from a import name,lists def test(): print("b:",name) print("b:",lists)
main.py
from a import name,lists from b import test if __name__ == '__main__': print("修改前-main:",name) name = "李四" print("修改后-main:", name) print("main:",lists) lists.append(100) # b模块中test的功能是打印a模块的name、lists test() """ 修改前-main: 张三 修改后-main: 李四 main: [1, 2, 3, 4, 5] b: 张三 b: [1, 2, 3, 4, 5, 100] """
运行后我们发现:
- a模块中的name被修改了,但在b模块中打印的还是原来的值。
- a模块中的lists添加了新的元素,显示正常。
原因:
- 使用from a import name 是在在当前模块创建一个name变量,该变量指向a模块中name变量所指向的值,即张三,修改name的值其实是修改name的引用,而字符串为不可变类型,name = "李四",是在内存中创建了字符串李四,然后name重新指向李四,所以之前的张三并没有改变。
- 而lists它是一个列表,是可变类型,所以在列表内添加新元素是可行的,但是lists是不能被重新赋值的,重新赋值时它的引用就会改变。
解决办法:
- 把定义全局变量的a.py使用import 导入。
就像这样:
b.py
import a def test(): print("b:",a.name) print("b:",a.lists)
main.py
import a from b import test if __name__ == '__main__': print("修改前-main:",a.name) name = "李四" print("修改后-main:", a.name) print("main:",a.lists) a.lists.append(100) # b模块中test的功能是打印a模块的name、lists test() """ 修改前-main: 张三 修改后-main: 张三 main: [1, 2, 3, 4, 5] b: 张三 b: [1, 2, 3, 4, 5, 100] """
上一篇: 获取ul li的value的值
下一篇: 司机心真大啊