Python ';从x导入变量';在蟒蛇3中
我今天感觉特别难受。考虑 mod1.pyPython ';从x导入变量';在蟒蛇3中,python,variables,scope,Python,Variables,Scope,我今天感觉特别难受。考虑 mod1.py count = 0 def foo (): global count count = count + 1 count = 0 lst = [1, 2, 3] def update_count(): global count count = count + 1 def update_lst(): lst.append(4) mod2.py import mod1 from mod1 import foo,
count = 0
def foo ():
global count
count = count + 1
count = 0
lst = [1, 2, 3]
def update_count():
global count
count = count + 1
def update_lst():
lst.append(4)
mod2.py
import mod1
from mod1 import foo, count
print("mod1.count = ", mod1.count)
print("count = ", count)
foo()
print("mod1.count = ", mod1.count)
print("count = ", count)
我假设count导入到mod2中会有效地使其全球化
> python3 mod2.py
mod1.count = 0
count = 0
mod1.count = 1
count = 0
我显然有一些基本的误解。我假设导入本质上会生成mod1.count和count别名,但事实并非如此。我猜这与同时使用“导入”和“从导入”有关。它们之间的区别可能是可用性
导入模块
允许您使用
运算符从模块访问方法。当
从模块导入内容
允许您使用某物
,而无需使用
运算符引用模块。
您还可以说它允许您在全局范围内使用某物
使用from
方法,您将在全局范围内导入内容。这并不意味着模块
中的东西消失了。它只是创建了这些方法的新实例。
因此,当您同时导入模块
和某物
的实例时,您可以通过任何方式(使用或不使用
操作符)访问某物。我想您已经基本回答了自己的问题。它们不是别名,而是两个不同的对象,可能是因为它们存在于不同的名称空间中。您可以通过导入然后打印(mod1.count是count)
来更简单地验证这一点。如果它们是别名,则返回True
。这是由于Python处理变量名称的方式。为了给解释提供一些依据,我扩展了您的示例,将列表作为第二个导入变量:
mod1.py
count = 0
def foo ():
global count
count = count + 1
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 Batcheld的经典著作,它很好地解释了名称在Python中的工作方式。相关:但在他的示例中,他使用
操作符获取模块中的变量,尽管他使用了来自模块导入变量
。