在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python/ Python中不同模塊 import 同一個模塊中的一個對象的時候,都是同一個對

Python中不同模塊 import 同一個模塊中的一個對象的時候,都是同一個對象嗎?

假設(shè)我在模塊 base 中定義了一個對象 obj, 然后在模塊 a, bcimport 了對象 obj.

然后我在模塊 a 中對 obj 進(jìn)行了修改, 模塊 bc 中的 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:

clipboard.png

因為這里實際就是同一個對象

2017年9月6日 16:26
編輯回答
莫小染

我給你做個簡單示例(環(huán)境:Python shell 3.6.5)

step1: 編寫t.py,保存在桌面。

clipboard.png

step2: 啟動shell,添加桌面的path。

clipboard.png

step3: import t并調(diào)用test函數(shù)。

clipboard.png

step4: 修改源文件,并嘗試再次調(diào)用。

clipboard.png
clipboard.png
可以看到,輸出與修改之前相同的內(nèi)容。這個原因,和你各個py文件之間的調(diào)用原理是相同的,那原因是什么?

原因:
python有它的垃圾回收機制,恰巧的是,它以引用計數(shù)為主。所以之前運行的py文件還在本次調(diào)用中(只要我不關(guān)閉shell),引用計數(shù)為1,所以如果在不引入imp模塊的reload重新載入,引用計數(shù)就不會到0,就還會輸出修改之前的內(nèi)容。

希望能讓你理解.

2017年6月3日 01:29
編輯回答
久舊酒
  • 模塊 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é)果會反饋到原模塊。
2017年5月4日 20:55