先回顧一下理解程度
什么是不可變類型和可變類型?
可變類型是,修改變量后 引用的內存地址不變,引用的內存中的內容發生變化(是針對變量名的引用來理解)。

# 在a.py中定義了一個test屬性 test = [1, 2] print(test ,id(test)) test.append('jack') print(test, id(test)) 結果 C:\Users\jackendoff\AppData\Local\Programs\Python\Python36-32\python.exe D:/pycharm_project/test_import/a.py [1, 2] 44687112 [1, 2, 'jack'] 44687112 Process finished with exit code 0
不可變類型,修改變量后,內存地址發生變化,引用的內容也發生變化(針對變量名的引用理解),(如int類型再內存中的存儲id是固定的,不同的數字存儲的位置是確定的)

# 在a.py中定義了一個test屬性 test = 5 print(test, id(test)) test = 6 print(test, id(test)) 結果 C:\Users\jackendoff\AppData\Local\Programs\Python\Python36-32\python.exe D:/pycharm_project/test_import/a.py 5 1795613520 6 1795613536 Process finished with exit code 0
下面寫四個腳本,驗證import的 導入對象的屬性 是不可變類型的修改,jia.py是導入了b.py和c.py兩個模塊,並運行,(千萬不要起abc.py,它是內置模塊)

1 # 在a.py中定義了一個test屬性 2 test = 2 3 print('in a')

import a # 引用了a.py模塊,是整個模塊的引用 print('first print in b.py', a.test) a.test = 3 print('second print in b.py', a.test) ''' 注意區分模塊和包的含義 模塊就是一個x.py的程序 包是包含許多xx.py程序的文件夾(該文件夾中必須有__init__.py程序) '''

import a # 引用了a.py模塊 print('first print in c.py', a.test) a.test = 4 print('second print in c.py', a.test)

# abc.py是python內置模塊的名字,腳本名字別亂起 import b import c print('first print in jia.py', b.a.test) print('second print in jia.py', c.a.test)

C:\Users\jackendoff\AppData\Local\Programs\Python\Python36-32\python.exe D:/pycharm_project/test_import/jia.py in a first print in b.py 2 second print in b.py 3 first print in c.py 3 second print in c.py 4 first print in jia.py 4 second print in jia.py 4 Process finished with exit code 0
b.py中second print和c.py中first print輸出都是3,說明b.py已經修改了模塊的屬性
下面再寫四個腳本,驗證from xx import x 能不能對模塊的不可變類型屬性修改,jia.py是導入了b.py和c.py兩個模塊,並運行。

# 在a.py中定義了一個test屬性 test = 2 print('in a')

from a import * # 引用了a.py模塊,是整個模塊的引用 print('first print in b.py', test) test = 3 print('second print in b.py', test)

from a import * # 引用了a.py模塊 print('first print in c.py', test) test = 4 print('second print in c.py', test)

# abc.py是python內置模塊的名字,腳本名字別亂起 import b import c print('first print in jia.py', b.test) print('second print in jia.py', c.test)

C:\Users\jackendoff\AppData\Local\Programs\Python\Python36-32\python.exe D:/pycharm_project/test_import/jia.py in a first print in b.py 2 second print in b.py 3 first print in c.py 2 second print in c.py 4 first print in jia.py 3 second print in jia.py 4 Process finished with exit code 0
b.py中second print和c.py中first print輸出一個是3一個是2,說明b.py沒有修改了模塊的屬性
下面再寫四個腳本,驗證from xx import x 能不能對模塊的可變類型屬性修改,jia.py是導入了b.py和c.py兩個模塊,並運行。

# 在a.py中定義了一個test屬性 test = [1, 2] print('in a')

from a import * # 引用了a.py模塊,是整個模塊的引用 print('first print in b.py', test) test.append('b') print('second print in b.py', test) ''' 注意區分模塊和包的含義 模塊就是一個x.py的程序 包是包含許多xx.py程序的文件夾(該文件夾中必須有__init__.py程序) '''

from a import * # 引用了a.py模塊 print('first print in c.py', test) test.append('c') print('second print in c.py', test)

# abc.py是python內置模塊的名字,腳本名字別亂起 import b import c print('first print in jia.py', b.test) print('second print in jia.py', c.test)

C:\Users\jackendoff\AppData\Local\Programs\Python\Python36-32\python.exe D:/pycharm_project/test_import/jia.py in a first print in b.py [1, 2] second print in b.py [1, 2, 'b'] first print in c.py [1, 2, 'b'] second print in c.py [1, 2, 'b', 'c'] first print in jia.py [1, 2, 'b', 'c'] second print in jia.py [1, 2, 'b', 'c'] Process finished with exit code 0
b.py中second print 和 c.py中first print 輸出的都是[1, 2, 'b'],說明b.py已經修改了模塊的屬性
總結:使用import xx 可以修改模塊對象的屬性(無論屬性是不是可變類型)
使用from xx import x 只能修改模塊對象的屬性是可變類型的(不可變類型不能修改)
這也是為甚麽,盡量不要使用 from XX import * 的原因,會發生屬性錯誤,
這也是為什么,導入模塊需要寫在程序開頭的位置,並且先導入內置模塊,再導入庫模塊,再導入自定義模塊