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

我知道我可以将它们放在main() 之外range_durxrange_dur让它们在内部被称为全局do_range()并被do_xrange()看到,但是上面的内容怎么不起作用?

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

还是除了将其用作全局之外还有其他解决方案吗?

4

2 回答 2

3

如果您使用的是 Python 3,请参阅pandubear 的答案-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模块吗?它做你想做的事;只是以更好的方式。

于 2013-10-12T17:19:45.440 回答
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()
于 2013-10-12T17:17:20.163 回答