【问题标题】:Python modules scope [duplicate]Python模块范围[重复]
【发布时间】:2014-02-24 21:54:11
【问题描述】:

假设我有一个名为foo 的Python 模块,它有一个函数bar() 和模块x = 'spam' 中的一个全局变量。 bar()使用这个x来操作。

如果我像import foo一样导入foo,然后调用foo.bar(),很明显会发生什么。

但是,如果我只像这样导入bar():from foo import bar,然后调用bar(),如果我的全局命名空间中还有一个变量x,会发生什么?

foo.py

x = 'spam'
def bar():
    print x

main.py

from foo import bar
x = 'eggs'
bar()

如果我将导入行替换为:from foo import bar, x?

编辑:(在这两种情况下它都会打印“垃圾邮件”,问题是为什么?)

【问题讨论】:

  • 何不试试看?
  • 我做到了,显然我对原因很感兴趣。 :)
  • 语句from foo import x 查找foo.x 的值,并将main 的本地命名空间中的x 绑定到它找到的值。变量foo.x 和main.x 是不同的,但恰好保持相同的值。为其中一个分配不同的值不会影响另一个。 [我无法将此作为答案发布,因为问题已关闭]。

标签: python module scope


【解决方案1】:

函数是在创建时保留有关自身的各种信息的对象。 检查bar.__module__和bar.__globals__的值,很明显它是如何工作的。

【讨论】:

    【解决方案2】:

    from foo import bar 导入 foo(无引用),并创建一个本地 bar 引用 foo.bar

    bar 看不到main.x


    你可以这样做类似这样的事情:

    import foo
    bar = foo.bar
    del foo
    

    (除非您已经有一个名为 foo 的对象,但现在已经不存在了)

    【讨论】:

      猜你喜欢
      • 2014-10-03
      • 2015-11-01
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      相关资源
      最近更新 更多