import xxx和from xxx import xx中修改被导入模块里面的变量的坑

现在有如下几个模块:
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]
"""

转载于:https://www.cnblogs.com/lxy0/p/11428238.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值