【问题标题】:Import module scope and variables导入模块范围和变量
【发布时间】:2015-03-15 19:16:35
【问题描述】:

我的问题是关于 python 2.7 命名空间和模块导入。我的问题是理解为什么会这样: 如果我有一个模块文件 memory.py:

memory={}
def insert_into(a,b):
   memory[a]=b

然后是两个文件 mod1.py 和 mod2.py 的代码相似: mod1.py:

import memory
memory.insert_into('a',1)

mod2.py:

 import memory
 memory.insert_into('b',2)

最后是我作为脚本运行的 test.py 文件:

import mod1,mod2

如果我测试一下:

mod1.memory.memory is mod2.memory.memory

它返回真。这是预期的吗? mod1 和 mod2 的命名空间在什么时候纠缠在一起? 对不起,如果我的问题没有意义,这是我的第一次。

【问题讨论】:

  • 根据您的代码,mod1.memory 存在,但我认为mod1.memory.memory 不存在。在我明白这一点之前,我很犹豫是否尝试进一步调试。
  • 作为记录,当我尝试这个时,我得到mod1.memory is mod2.memory 返回False
  • 只有一个对象,你会期待什么?

标签: python import namespaces


【解决方案1】:

它们根本不会被破坏。您只需在两个地方导入相同的对象,自然 Python 会报告它是相同的。

【讨论】:

  • 当然!谢谢,我早该想到的。
【解决方案2】:

在 Python 中,模块本身就像一个单例。 你所看到的就是它的效果。

【讨论】:

    【解决方案3】:

    您可能会注意到,使用 mod1.memory.memorymod2.memory.memory 实际上您没有更新这些模块中的 memory 字典,但它们每个都是 module 对象并且都引用同一个对象(一个空字典(memory={})) 和x is y 为真当且仅当 x 和 y 是同一个对象时,这里的结果为真。

    所以在test.py你可以试试:

    print mod1.memory.memory
    print mod2.memory.memory
    

    【讨论】:

      猜你喜欢
      • 2014-01-20
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      • 1970-01-01
      • 2019-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多