2013-10-12 34 views
1
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_durxrange_dur的主要外部(),并让他们内部do_range()do_xrange()称为全局待观察,但怎么来的上述不工作?Python变量知名度

什么是python变量可见性的内部工作?

还是有另一种解决方案,除了使用它作为全球?

+1

或者,您可以将它们作为参数传递给相应的函数并以“返回”值计算。 –

回答

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模块吗?它做你正在做的事情;只是以更好的方式。

+0

python是故意设计的这种方式来限制程序员传递参数? ah awesome timeit模块 – ealeon

+0

而不是使用列表来包装值,我喜欢使用一个类(名为'nonlocal',所以你知道它在Python 3中的作用与'nonlocal'相同。然后你可以访问'nonlocal.x'等 – kindall

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() 
+0

我有python 2.7所以这不适用于我 – ealeon

+0

@ealeon替换'非本地'与'全球' – SethMMorton

+0

@SethMMorton只有当我把range_dur和xrange_dur在主 – ealeon