Nic*_*bey 2 python import module
我注意到python如何处理模块名称的一种特殊行为.
如果我写:
import a.b
import a
然后尝试在模块ab中引用某些东西,它没有问题.
但是,如果我尝试的只是略有不同:
import a.b
import c as a
然后尝试引用模块ab中的某些内容,我收到错误,说:
AttributeError:'module'对象没有属性'b'
我明白,显而易见的解决方案就是没有两个不同的模块,我用相同的名称来引用它们.但是,我仍然很好奇是什么导致了这种行为的改变.为什么一个工作而另一个工作?
Amb*_*ber 11
你为什么期望它起作用?所有4个import语句都是变量的赋值a.因此,如果您分配c到a,它覆盖的内容的东西,没有一个.b属性.
以下是第一种情况:
import a.b运行时,Python的加载模块a,然后加载模块a.b到加载a模块的属性b.然后它将结果赋给变量a.import a不会导入任何新的东西,因为模块a已经被加载.它只是从重新分配相同的模块sys.modules['a']来a.以下是第二种情况:
import a.b运行时,Python的加载模块a,然后加载模块a.b到加载a模块的属性b.然后它将结果赋给变量a.import c as a运行时,它加载模块c,然后分配该模块变量a,覆盖内容(a = sys.modules['c']).你可以通过比较的内容进行验证sys.modules['a']与内容a-他们会在这种情况下不同.