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变量可见性的内部工作?
或者除了将它作为全球使用之外还有其他解决方案吗?
答案 0 :(得分:3)
如果您使用的是Python 3,请参阅pandubear's answer - nonlocal
即可。
如果您使用的是Python 2,则需要使用基于可变对象的变通方法,以避免+=
引起的重新绑定。最简单的方法是将值包装在列表中:
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()
另一种选择 - 至少对于像你这样的超简单基准测试脚本 - 将使用全局变量。然后,您可以使用global
代替nonlocal
。它并不漂亮,但对于基准可爱并不重要。
最佳解决方案只是使用return
来返回结果!
哦,你知道timeit
模块吗?它做你想做的事;只是以更好的方式。
答案 1 :(得分:2)
您可以看到这些变量,即获取它们的值 - 但是如果不使用非本地语句,则无法设置它们的值。使用此:
def main():
range_dur = 0
xrange_dur = 0
def do_range():
nonlocal range_dur
start = time.time()
for i in range(2,10):
print i
range_dur += time.time() - start
def do_xrange():
nonlocal xrange_dur
start = time.time()
for i in xrange(2,10):
print i
xrange_dur += time.time() - start
do_range()
do_xrange()
print range_dur
print xrange_dur
if __name__ == '__main__':
main()