作为另一种体验的一部分,我在列表理解中遇到了问题。简单地说,如果我正在尝试以下代码:
m = [ k**2 for k in range(7)]
print m
[0, 1, 4, 9, 16, 25, 36]
print k
6
- 我的问题是python如何能够在列表理解之外获得k的值?
- 为什么 k 不被垃圾收集?
- 这不是内存泄漏吗?
作为另一种体验的一部分,我在列表理解中遇到了问题。简单地说,如果我正在尝试以下代码:
m = [ k**2 for k in range(7)]
print m
[0, 1, 4, 9, 16, 25, 36]
print k
6
因为在 Python 2 中,列表变量“泄漏”到周围的范围。这是构建列表推导方式的错误。
这已针对 dict 和集合推导、生成器表达式以及在 Python 3 中针对列表推导进行了更正。
这不是内存泄漏。这只是变量范围内的错误。
不,这不是通常定义的内存泄漏。在 Python 2.x 中,列表推导式不是单独的范围,因此您在列表推导式中使用的变量位于包含它的函数的范围内。通过在列表理解k
之前设置,您可以轻松地看到这一点;listcomp 会破坏它。
因为存在有效的引用,所以k
指向的对象(正确地)没有被垃圾收集。
在 Python 3.x 中,这发生了变化;所有的理解都会创建自己的范围,并且不会“泄漏”到封闭范围中。
然而,在 Python 2.x 中,生成器表达式确实有自己的作用域,所以如果你想要这种行为,只需像这样编写它:
m = list(k**2 for k in range(7))