現在有如下幾個模塊: 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]
"""