【问题标题】:How does python load global variables?python如何加载全局变量?
【发布时间】:2015-08-28 18:40:32
【问题描述】:

[找不到我想要的。如果这是一个重复的问题,我们深表歉意。]

在这段代码中:

import heavy_function

_data = heavy_function()

def foo():
    print _data

def bar():
    print 'Call no 1'
    foo()
    print 'Call no 2'
    foo()

bar()

如果我打电话

bar()

如代码中所示,或者如果我通过导入从其他模块调用它,

_数据

每次函数调用时都加载它?或者它会被加载一次并存储以供进一步使用?

【问题讨论】:

  • 一旦语句_data = heavy_function()被执行,返回值就会存储在变量中,因此每次使用变量时都会显示存储的值
  • _data 是一个指向函数返回值的名字,你赋值一次,函数就被调用一次
  • 谢谢大家。这是我直觉上的预期,想要确定。

标签: python function variables loading global


【解决方案1】:

加载此模块后,您的 heavy_function() 将立即加载并将其值存储到 _data 中,而此 _data 将存储在 globals() 中。然后不管你使用同一个对象多少次都会被忽略。

为了您的理解,我只是通过给出一个列表[1, 2, 3] 来模拟函数值,这里我通过比较foo() 返回值与_datarefcount 来检查对象身份以显示它不会被多次引用。

#import heavy_function
import sys
_data = [1, 2, 3] # heavy_function()

def foo():
    print _data

def bar():
    print 'Call no 1'
    value1 = foo()
    print sys.getrefcount(_data)
    print 'Call no 2'
    value2 = foo()
    print sys.getrefcount(_data)
    print 'call no 3'
    value3 = foo()
    print sys.getrefcount(_data)

    print 'Check referenced values..'
    print value1 is value2 

bar()

输出:

Call no 1
[1, 2, 3]
2
Call no 2
[1, 2, 3]
2
call no 3
[1, 2, 3]
2
Check referenced values..
True

如果您在第三次调用之后看到相同的对象从foo 返回,而这个print value1 is value2 可以帮助您识别它。

【讨论】:

  • 我最感谢你,@gsb-eng。我不知道 getrefcount() 函数。这很酷!
  • 我不知道如何标记为已接受。我以为我没有足够的声誉做任何事情:) 你的回答是最好的!
【解决方案2】:

加载一次,返回值被引用两次

【讨论】:

    【解决方案3】:

    _data 只会被赋予一次重函数()的返回值(当模块首次导入或运行时)。之后,它将被简单地访问。

    您应该注意不要尝试在函数内部分配它,尽管没有首先使用 global 关键字指定它是全局的。

    【讨论】:

    • 建议global 是个坏主意。
    猜你喜欢
    • 1970-01-01
    • 2019-07-24
    • 2011-02-08
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多