3

作为另一种体验的一部分,我在列表理解中遇到了问题。简单地说,如果我正在尝试以下代码:

m = [ k**2 for k in range(7)]
print m
[0, 1, 4, 9, 16, 25, 36]
print k
6
  1. 我的问题是python如何能够在列表理解之外获得k的值?
  2. 为什么 k 不被垃圾收集?
  3. 这不是内存泄漏吗?
4

2 回答 2

11

因为在 Python 2 中,列表变量“泄漏”到周围的范围。这是构建列表推导方式的错误。

这已针对 dict 和集合推导、生成器表达式以及在 Python 3 中针对列表推导进行了更正。

这不是内存泄漏。这只是变量范围内的错误。

于 2013-05-17T15:19:27.540 回答
7

不,这不是通常定义的内存泄漏。在 Python 2.x 中,列表推导式不是单独的范围,因此您在列表推导式中使用的变量位于包含它的函数的范围内。通过在列表理解k 之前设置,您可以轻松地看到这一点;listcomp 会破坏它。

因为存在有效的引用,所以k指向的对象(正确地)没有被垃圾收集。

在 Python 3.x 中,这发生了变化;所有的理解都会创建自己的范围,并且不会“泄漏”到封闭范围中。

然而,在 Python 2.x 中,生成器表达式确实有自己的作用域,所以如果你想要这种行为,只需像这样编写它:

m = list(k**2 for k in range(7))
于 2013-05-17T15:20:19.823 回答