Python变量可见性

时间:2013-10-12 17:13:56

标签: python python-2.x

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放在main()之外,并将它们称为do_range()do_xrange()内的全局,但上面的内容是怎样的工作?

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

或者除了将它作为全球使用之外还有其他解决方案吗?

2 个答案:

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