【发布时间】:2020-07-23 22:51:48
【问题描述】:
给出的常见解释(如12270954 和710551)是from X import *
使命名空间混乱,因此不推荐使用。但是,下面的例子
表明它不仅仅是混乱的命名空间。
考虑以下代码:
x1.py:
g_c = 5
class TestClass():
def run(self):
global g_c
g_c = 1
print(g_c) # prints 1
x2.py:
from x1 import *
t = TestClass()
t.run()
print(g_c) # prints 5, why?
x3.py:
import x1
t = x1.TestClass()
t.run()
print(x1.g_c) # prints 1
运行x2.py 和x3.py 的结果不同(在python 3.6.8 上)。有人可以解释为什么
两个导入的行为不同?
额外说明:(展示@tdelaney 提到的关于列表的说明)
像这样更改 x1.py 中的分配:
g_c = [5]
...
g_c.append(1)
现在,x2.py 和 x3.py 都给出了相同的答案。只有在使用原子类型时才会出现问题。
【问题讨论】:
-
因为星号导入分配给导入模块中的新变量。他们做两件不同的事情,他们的行为并没有真正不同。您可以将加星标的导入和
from module import some_var视为import module; some_var = module.some_var; del module的糖 -
对我来说,避免使用
from X import *的原因是为了将来的可读性。当我看到像find这样命名相当模糊的函数时,我想知道它是从哪里来的,而不需要通过导入。 -
感谢@juanpa.arrivillaga,主要问题是对于“import *”,变量被复制而不被引用。这在 python 文档的任何地方都明确提到了吗?
-
@R71 这就是始终变量的工作方式。注意,object 没有被复制,新变量被添加到命名空间。如果没有特殊的赋值语义,它就无法以任何其他方式工作。
标签: python python-3.x