考虑以下两个模块:
# a.py
x = 1
和
# b.py
x = 2
以下程序的输出是否在所有Python 3实现中定义良好且相同?
from a import *
from b import *
print(x)
答案 0 :(得分:0)
根据内置函数__import__()
的文档(在每个import
语句的幕后调用):
...语句
from spam.ham import eggs, sausage as saus
导致_temp = __import__('spam.ham', globals(), locals(), ['eggs', 'sausage'], 0) eggs = _temp.eggs saus = _temp.sausage
此处,
spam.ham
模块从__import__()
返回。从此对象中,将检索要导入的名称并将其分配给各自的名称。
虽然这种解释是指导入特定名称,但机制很明确:首先,导入模块,然后将该模块的相关属性分配给本地名称空间中的名称。
因此,是,行为定义明确:因from a import *
而分配的任何名称与后续from b import *
指定的名称冲突的名称都是被覆盖,就像他们在
x = 1
x = 2
请注意,即使您通过使用自定义导入功能替换builtins.__import__()
来搞乱导入机制,这仍然是正确的:
>>> class Fake: pass
...
>>> def fake_import(name, *args, **kwargs):
... module = Fake()
... module.x = name
... return module
...
>>> import builtins
>>> builtins.__import__ = fake_import
>>> from nonexistent.module import *
>>> x
'nonexistent.module'
>>> from another_made_up_name import *
>>> x
'another_made_up_name'
>>>