【问题标题】:Import module, that import another module. Python导入模块,即导入另一个模块。 Python
【发布时间】:2018-04-23 20:24:35
【问题描述】:

我很好奇当我们导入一个模块然后又导入另一个模块时会发生什么。所以我创建了两个模块:module1 和 module2。

模块1:

import random
print(random.randint(0,10))
print("module1 work")

模块2:

import module1
print("module2 work")

当我运行 module2 时,它给了我这个输出:

1
module1 work
module2 work

所以,当我导入module1 时,我决定确实导入了random。但是当我输入 Shell print(random.randint(0,10))时,它会抛出 NameError: name 'random' is not defined。所以random 不是从module1 导入的。但是这种情况下为什么module2会打印1,却没有抛出和Shell一样的错误呢?

【问题讨论】:

  • 仅仅因为一个模块已经被执行并不一定意味着module对象被绑定到全局命名空间中的一个名字。试试module1.random.randint(0,10)

标签: python python-import


【解决方案1】:

每个模块都有自己的范围(或命名空间,如果您更熟悉该术语)。如果要从module2访问random,需要在module2中导入。解释器共享您执行的模块的范围,因此只有在该模块的全局命名空间中声明的变量才能被访问。如果你想从只导入module2的解释器访问random,你需要指定module1.random

或者,您可以将import module1 替换为from module1 import *。这将复制所有内容,包括对random 的引用。所以random 可以在全球范围内访问。

【讨论】:

  • 或者你可以做print(module1.random.randint(0,10)),如果你不想在module2中导入随机数
【解决方案2】:

这是因为您实际上并没有将 random 导入 shell,而只是将包含模块的文件。

我们可以使用现有的模块作为示例,例如 tkinter,打开方式为:

import enum
import sys

它们导入到 Tkinter 模块中,但是当您导入 Tkinter 时,它们并没有附带它。

简而言之,您的module1 已随机导入,但导入module1 不会同时导入random

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2020-05-18
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    相关资源
    最近更新 更多