python import xx和from xx import x 中的坑


先回顧一下理解程度

什么是不可變類型和可變類型?

  可變類型是,修改變量后 引用的內存地址不變,引用的內存中的內容發生變化(是針對變量名的引用來理解)。

# 在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')
a.py
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程序)
'''
b.py
import a
# 引用了a.py模塊
print('first print in c.py', a.test)

a.test = 4
print('second print in c.py', a.test)
c.py
# 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)
jia.py
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
jia.py的運行結果

 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')
a.py
from a import *
# 引用了a.py模塊,是整個模塊的引用
print('first print in b.py', test)
test = 3
print('second print in b.py', test)
b.py
from a import *
# 引用了a.py模塊
print('first print in c.py', test)

test = 4
print('second print in c.py', test)
c.py
# abc.py是python內置模塊的名字,腳本名字別亂起
import b
import c
print('first print in jia.py', b.test)
print('second print in jia.py', c.test)
jia,py
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
jia.py的運行結果

 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')
a.py
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程序)
'''
b.py
from a import *
# 引用了a.py模塊
print('first print in c.py', test)

test.append('c')
print('second print in c.py', test)
c.py
# abc.py是python內置模塊的名字,腳本名字別亂起
import b
import c
print('first print in jia.py', b.test)
print('second print in jia.py', c.test)
jia.py
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
jia.py的運行結果

b.py中second print 和 c.py中first print 輸出的都是[1, 2, 'b'],說明b.py已經修改了模塊的屬性

 

總結:使用import xx 可以修改模塊對象的屬性(無論屬性是不是可變類型)

      使用from xx import x 只能修改模塊對象的屬性是可變類型的(不可變類型不能修改)

這也是為甚麽,盡量不要使用 from XX import * 的原因,會發生屬性錯誤,

這也是為什么,導入模塊需要寫在程序開頭的位置,並且先導入內置模塊,再導入庫模塊,再導入自定義模塊


免責聲明!

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



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