【问题标题】:Do we need to declare global for a variable if we only read it? [duplicate]如果我们只读取它,我们是否需要为变量声明全局? [复制]
【发布时间】:2012-02-28 18:14:12
【问题描述】:

考虑一下

# global variable
i_am_global = {}

def get_global():
    global i_am_global # declare 1
    if i_am_global is not None:
        return i_am_global
    global i_am_global # declare 2
    i_am_global = do_something()
    return i_am_global
def main():
    get_global()
if __name__ == "__main__":
    main()

在这种情况下,我们需要将 global 放在哪里?在 # 声明 1 还是在 # 声明 2?为什么?

这是因为我听说(所以我问这个问题)全局会导致内存开销。请纠正我的理解

谢谢

【问题讨论】:

  • "全局导致内存开销" - 你听错了。 Python 中的global 语句不会造成内存开销。
  • 两个地方都试过了,你发现了什么?当你在没有global 声明的情况下尝试它时,你观察到了什么?
  • #2 需要它,但 #1 不需要它。看看这个问题:stackoverflow.com/questions/9366212/…
  • 那是我需要的链接。谢谢@DanGerhardsson

标签: python


【解决方案1】:

如果您只读取过变量,那么您不必使用global,但我个人出于文档原因这样做。我还使用全局命名约定。我不认为global 关键字有内存开销,但它们本身的全局变量通常被认为是不可取的。

【讨论】:

    【解决方案2】:

    所有顶级函数和类也是全局变量。因此,将任何对象声明为全局都没有问题。

    但是您应该了解,任何名称前面没有下划线的变量都用作该模块和要导入的项目的公共接口。考虑这段代码

    #module mutual_imports.py
    global_object = 2
    
    def changeGlobalObject():
        global global_object
        global_object = "two"
    

    让我们检查这个模块:

    >>> from mutual_imports import global_object, changeGlobalObject
    >>> global_object
    2
    >>> changeGlobalObject()
    >>> global_object
    2
    >>> from mutual_imports import global_object
    >>> global_object
    'two'
    

    那么,如果您在不同的时间导入可能会有所不同的项目,您有什么看法。

    所有可变的东西都可以成为某些对象的可变状态,只是因为它更容易和更清晰地处理它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      • 2020-07-21
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      • 2019-10-04
      相关资源
      最近更新 更多