当前位置: 移动技术网 > IT编程>脚本编程>Python > import xxx和from xxx import xx中修改被导入模块里面的变量的坑

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

2019年08月29日  | 移动技术网IT编程  | 我要评论

什么颜色对眼睛好,索斯塔,雀梅

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网