python如何加载全局变量?

How does python load global variables?

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

在此代码中:

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

每次函数调用时都加载吗?还是加载一次并存储以供进一步使用?

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

_data 只会被分配一次 heavy_function() 的 return 值(当模块首次导入或 运行 时)。之后,它将被简单地访问。

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

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

为了您的理解,我只是通过给出一个列表 [1, 2, 3] 来模拟函数值,在这里我通过比较 foo() return 值和 _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 得到 returned,这个 print value1 is value2 可以帮助您识别。