Python中不同模块 import 同一个模块中的一个对象的时候,都是同一个对象吗?
假设我在模块 base 中定义了一个对象 obj, 然后在模块 a, b 和 c 中 import 了对象 obj.
然后我在模块 a 中对 obj 进行了修改, 模块 b 和 c 中的 obj 会产生相应的修改吗?为什么?
回答:
我给你做个简单示例(环境:Python shell 3.6.5)
step1: 编写t.py,保存在桌面。

step2: 启动shell,添加桌面的path。

step3: import t并调用test函数。

step4: 修改源文件,并尝试再次调用。


可以看到,输出与修改之前相同的内容。这个原因,和你各个py文件之间的调用原理是相同的,那原因是什么?
原因:
python有它的垃圾回收机制,恰巧的是,它以引用计数为主。所以之前运行的py文件还在本次调用中(只要我不关闭shell),引用计数为1,所以如果在不引入imp模块的reload重新载入,引用计数就不会到0,就还会输出修改之前的内容。
希望能让你理解.
回答:
模块
base:num = 10 # 数值类型lst = [0] # 引用类型
模块
a:from base import num, lst # 直接导入num = 100
lst.append('a')
模块
b:import base # 通过模块调用base.num = 100
base.lst.append('b')
执行脚本
run.py:import baseprint(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))
运行结果:
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 的方式导入的 num, lst, 在修改后, num 的修改没有反馈到 base, 而 lst 的修改反馈到了 base.
通过 import base 的方式修改 num, lst, 两者的修改都反馈到了 base.
简单的结论:
- 通过
from xxx import xxx的方式导入的对象, 如果是 数值对象 的话, 相当于是在当前模块创建了一个同名对象, 并将值赋给这个同名对象。 如果是 引用对象 的话, 相当于是在当前模块创建了一个对该对象的引用。 当前模块做的修改会反馈到原模块。 - 通过
import xxx的方式导入模块, 然后用module.xxx的方式对模块内的对象进行调用或修改, 结果会反馈到原模块。
回答:
如一楼, 修改模块文件的话, 不会相应修改
如果要相应修改需要重新加载
————————————————华丽的分割线————————————————
另外一种会修改的栗子:
# m_base.pynum = 1
myList = [1]
# m_a.pyimport 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.pyimport 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.pyimport m_a
import m_b
执行python m_all.py:

因为这里实际就是同一个对象
以上是 Python中不同模块 import 同一个模块中的一个对象的时候,都是同一个对象吗? 的全部内容, 来源链接: utcz.com/a/156860.html

