这是由于 Python 处理变量名称的方式。为了有一些解释的基础,我用一个列表作为第二个导入变量扩展了你的示例:
mod1.py
count = 0
lst = [1, 2, 3]
def update_count():
global count
count = count + 1
def update_lst():
lst.append(4)
test.py
import mod1
from mod1 import count, lst, update_count, update_lst
print("mod1.count = ", mod1.count)
print("count = ", count)
print("mod1.lst = ", mod1.lst)
print("lst = ", lst)
update_count()
update_lst()
print('\nAfter updates: \n')
print("mod1.count = ", mod1.count)
print("count = ", count)
print("mod1.lst = ", mod1.lst)
print("lst = ", lst)
输出:
mod1.count = 0
count = 0
mod1.lst = [1, 2, 3]
lst = [1, 2, 3]
After updates:
mod1.count = 1
count = 0
mod1.lst = [1, 2, 3, 4]
lst = [1, 2, 3, 4]
那么,发生了什么?
当您导入 count 和 lst 时,这些新名称会在脚本的命名空间中创建。名称count 是mod1.count 已引用的整数对象0 的另一个名称,名称lst 是mod1.lst 已引用的列表的另一个名称。
当我们执行更新时,模块中的列表得到更新,但它仍然是同一个对象:mod1.lst 和 lst 仍然引用同一个对象。
mod1.count 的情况有所不同,因为我们让这个名称指向一个新对象,即count = count + 1 中的整数1。
现在,mod1.count 指的是整数对象1,而主脚本中的count 仍然指的是原始的0 对象。
所以,这只是正常的 Python 名称行为。
如果您还没有阅读,我推荐 Ned Batchelder 的经典著作 Facts and myths about Python names and values,它很好地解释了名称在 Python 中的工作原理。