【问题标题】:Python import and from x import. What is real difference between them?Python 导入和从 x 导入。它们之间的真正区别是什么?
【发布时间】:2018-04-06 20:17:52
【问题描述】:

我已经阅读了另外两个关于它的问题。 this

但我不明白这种行为:

#mod1 __init__.py
g = 5

#mod2 __init__.py
from mod1 import g
def bar():
    print g

#main1.py
import mod1
mod1.g = 10
from mod2 import bar
bar() # prints 10

#main2.py
from mod1 import g
g = 10
from mod2 import bar
bar()

所以问题是为什么 main1 打印 10 而 main2 打印 5? from import 和 import 的真正区别是什么?

【问题讨论】:

    标签: python


    【解决方案1】:

    这与范围有关

    mod2 导入 mod1 (g=5)

    main1 将 mod1.g 设置为 10,并要求 mod2 打印 mod1.g 的值

    main2 将 main2.g 设置为 10,但 mod1.g 不变

    【讨论】:

    • 谢谢。所以 main1 使用对 mod1.g 的引用,而 main2 使用 mod1.g 的副本,对吗?
    • 通过from mod1 import gg=10实际上是指在mod1中定义的变量
    • main2 不使用副本。它只是创建了一个新变量 g
    【解决方案2】:

    关键是在main1() 中,您将模块mod1 中的变量g 设置为10,因此调用bar() 返回10。我认为这很清楚。 在main2() 中,您首先将g 设置为10,但是当mod2 导入mod1 时,它会获得一个带有初始变量集的新范围。尝试在main2() 中打印g 调用mod2 之后,我猜它会打印更改后的值(10)。

    您必须记住,import 只是告诉解释器查找相应模块中调用的任何内容(就像您要再次打开脚本一样)。当然,当程序更改变量时,分配给变量的值不会在脚本中更改。解释器仅读取 .py 文件一次(在您的情况下再次读取),即在导入它时。

    【讨论】:

    • 我试过打印 5. from mod1 import g from mod2 import bar g = 10
    猜你喜欢
    • 2012-08-29
    • 1970-01-01
    • 2014-02-05
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    相关资源
    最近更新 更多