Python:"import ... as"会导致错误的引用

Nic*_*bey 2 python import module

我注意到python如何处理模块名称的一种特殊行为.

如果我写:

import a.b
import a
Run Code Online (Sandbox Code Playgroud)

然后尝试在模块ab中引用某些东西,它没有问题.

但是,如果我尝试的只是略有不同:

import a.b
import c as a
Run Code Online (Sandbox Code Playgroud)

然后尝试引用模块ab中的某些内容,我收到错误,说:

AttributeError:'module'对象没有属性'b'

我明白,显而易见的解决方案就是没有两个不同的模块,我用相同的名称来引用它们.但是,我仍然很好奇是什么导致了这种行为的改变.为什么一个工作而另一个工作?

Amb*_*ber 11

你为什么期望它起作用?所有4个import语句都是变量的赋值a.因此,如果您分配ca,它覆盖的内容的东西,没有一个.b属性.


以下是第一种情况:

  1. import a.b运行时,Python的加载模块a,然后加载模块a.b到加载a模块的属性b.然后它将结果赋给变量a.
  2. import a不会导入任何新的东西,因为模块a已经被加载.它只是从重新分配相同的模块sys.modules['a']a.

以下是第二种情况:

  1. import a.b运行时,Python的加载模块a,然后加载模块a.b到加载a模块的属性b.然后它将结果赋给变量a.
  2. import c as a运行时,它加载模块c,然后分配该模块变量a,覆盖内容(a = sys.modules['c']).你可以通过比较的内容进行验证sys.modules['a']与内容a-他们会在这种情况下不同.