假設(shè)我在模塊 base 中定義了一個對象 obj, 然后在模塊 a, b 和 c 中 import 了對象 obj.
然后我在模塊 a 中對 obj 進(jìn)行了修改, 模塊 b 和 c 中的 obj 會產(chǎn)生相應(yīng)的修改嗎?為什么?
如一樓, 修改模塊文件的話, 不會相應(yīng)修改
如果要相應(yīng)修改需要重新加載
————————————————華麗的分割線————————————————
另外一種會修改的栗子:
# m_base.py
num = 1
myList = [1]
# m_a.py
import m_base
import threading
def doChange():
print('do change')
m_base.num = 2
m_base.myList[0] = 2
timer = threading.Timer(5, doChange)
timer.start()
# m_b.py
import time
import m_base
def printBase():
while 1:
print('b num:', m_base.num)
print('b list:', m_base.myList[0])
print('')
time.sleep(1)
printBase()
# m_all.py
import m_a
import m_b
執(zhí)行python m_all.py:
因為這里實際就是同一個對象
我給你做個簡單示例(環(huán)境:Python shell 3.6.5)
step1: 編寫t.py,保存在桌面。
step2: 啟動shell,添加桌面的path。
step3: import t并調(diào)用test函數(shù)。
step4: 修改源文件,并嘗試再次調(diào)用。
可以看到,輸出與修改之前相同的內(nèi)容。這個原因,和你各個py文件之間的調(diào)用原理是相同的,那原因是什么?
原因:
python有它的垃圾回收機制,恰巧的是,它以引用計數(shù)為主。所以之前運行的py文件還在本次調(diào)用中(只要我不關(guān)閉shell),引用計數(shù)為1,所以如果在不引入imp模塊的reload重新載入,引用計數(shù)就不會到0,就還會輸出修改之前的內(nèi)容。
希望能讓你理解.
模塊 base:
num = 10 # 數(shù)值類型
lst = [0] # 引用類型
模塊 a:
from base import num, lst # 直接導(dǎo)入
num = 100
lst.append('a')
模塊 b:
import base # 通過模塊調(diào)用
base.num = 100
base.lst.append('b')
執(zhí)行腳本 run.py:
import base
print(base.num, id(base.num))
print(base.lst, id(base.lst))
print('--------------------')
import a
print(a.num, id(a.num))
print(a.lst, id(a.lst))
print(base.num, id(base.num))
print(base.lst, id(base.lst))
print('--------------------')
import b
print(base.num, id(base.num))
print(base.lst, id(base.lst))
運行結(jié)果:
10 1578461456
[0] 37413272
--------------------
100 1578462896
[0, 'a'] 37413272
10 1578461456
[0, 'a'] 37413272
--------------------
100 1578462896
[0, 'a', 'b'] 37413272
可以看到, 通過 from base import num, lst 的方式導(dǎo)入的 num, lst, 在修改后, num 的修改沒有反饋到 base, 而 lst 的修改反饋到了 base.
通過 import base 的方式修改 num, lst, 兩者的修改都反饋到了 base.
簡單的結(jié)論:
from xxx import xxx 的方式導(dǎo)入的對象, 如果是 數(shù)值對象 的話, 相當(dāng)于是在當(dāng)前模塊創(chuàng)建了一個同名對象, 并將值賦給這個同名對象。 如果是 引用對象 的話, 相當(dāng)于是在當(dāng)前模塊創(chuàng)建了一個對該對象的引用。 當(dāng)前模塊做的修改會反饋到原模塊。import xxx 的方式導(dǎo)入模塊, 然后用 module.xxx 的方式對模塊內(nèi)的對象進(jìn)行調(diào)用或修改, 結(jié)果會反饋到原模塊。北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。