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 值和 _data
和 refcount
以表明它没有被多次引用。
#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
可以帮助您识别。
[找不到我想要的东西。如果这是一个重复的问题,我们深表歉意。]
在此代码中:
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 值和 _data
和 refcount
以表明它没有被多次引用。
#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
可以帮助您识别。