def main():
range_dur = 0
xrange_dur = 0
def do_range():
start = time.time()
for i in range(2,10):
print i
range_dur += time.time() - start <---- cant see
def do_xrange():
start = time.time()
for i in xrange(2,10):
print i
xrange_dur += time.time() - start <---- cant see
do_range()
do_xrange()
print range_dur
print xrange_dur
if __name__ == '__main__':
main()
我知道我可以将 range_dur
和 xrange_dur
放在 main() 之外,并在 do_range()
和 内部调用它们do_xrange()
可以看到,但是上面的为什么不起作用?
python 变量可见性的内部工作原理是什么?
或者除了将其用作全局之外还有其他解决方案吗?
最佳答案
如果您使用的是 Python 3,请参阅 pandubear's answer - nonlocal
是要走的路。
如果您使用的是 Python 2,则需要使用基于可变对象的解决方法,以避免 +=
引起的重新绑定(bind)。最简单的方法是将值包装在列表中:
def main():
range_dur = [0]
xrange_dur = [0]
def do_range():
start = time.time()
for i in range(2,10):
print i
range_dur[0] += time.time() - start
def do_xrange():
start = time.time()
for i in xrange(2,10):
print i
xrange_dur[0] += time.time() - start
do_range()
do_xrange()
print range_dur[0]
print xrange_dur[0]
if __name__ == '__main__':
main()
另一个选择——至少对于像你这样的 super 简单的基准测试脚本——是使用全局变量。然后你可以使用 global
而不是 nonlocal
。它并不漂亮,但对于基准测试来说,漂亮并不重要。
不过,最佳解决方案是简单地使用return
返回结果!
哦,你知道timeit
吗?模块?它做你想做的事;只是以一种更好的方式。
关于Python变量可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19336969/