Python变量可见性

标签 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 变量可见性的内部工作原理是什么?

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

最佳答案

如果您使用的是 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/

相关文章:

python - Python2 和 Python3 的正则表达式差异

python - 如何在linux ubuntu终端上安装python3.9?

python - 生成随机列表列表

Python3 无法访问 python2 模块 (ubuntu)

python - 如何记录采用多种类型的参数

python - Python2 中的 dict.items() 和 dict.iteritems() 有什么区别?

python - tkinter 不更新值

Python 字典打印选项

python - 在线版scikit-learn的TfidfVectorizer

python - 使用 PrettyTable,我可以编写一个函数来接收输入并将它们添加到表中,这样我就不必不断地重复自己吗?