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]
"""


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM