在python中,'import foo.bar as bar'和'from foo import bar'有什么区别?

In python, what is the difference between 'import foo.bar as bar' and 'from foo import bar'?

我在 pyTorch 和 matplotlib 中看到了这个约定:

import torch.nn as nn
import torch.optim as optim

import matplotlib.pyplot as plt

为什么要将整个路径 (module.submodule) 作为别名而不只是子模块导入是有原因的吗?如果我这样导入有什么区别:

from torch import nn
from torch import optim

from matplotlib import pyplot as plt

编辑:所以对于一般情况:

import foo.bar as bar    # [1]
from foo import bar      # [2]

是否存在引用 bar 的代码,使得它 运行 与 [1] 而不是 [2](反之亦然)? IE。这两种导入方式有functional区别吗?

import blank as blank 允许您在整个程序中引用该模块作为该名称。

from blank import blank 从模块中导入特定的方法、函数和 类。

在幕后,所有导入语句基本上都映射到内置 __import__ 例如:

import torch.nn as nn

变成

nn = __import__("torch.nn", globals(), locals(),  [], 0)

类似地:

from torch import nn

变成

nn = __import__("torch", globals(), locals(), ["nn"], 0)

略有不同但功能相同。

参考:https://docs.python.org/3/library/functions.html#import