Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ';从x导入变量';在蟒蛇3中_Python_Variables_Scope - Fatal编程技术网

Python ';从x导入变量';在蟒蛇3中

Python ';从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,

我今天感觉特别难受。考虑

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

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中的工作方式。

相关:但在他的示例中,他使用
操作符获取模块中的变量,尽管他使用了
来自模块导入变量