是的,这有点狡猾。一个类并没有真正引入新的作用域,只是看起来有点像它。这样的结构暴露出差异。
这个想法是,当您使用生成器表达式时,它等同于使用lambda:
class Brie(object): base= 2 powers= map(lambda i: base**i, xrange(5))
或明确地作为函数语句:
class Brie(object): base= 2 def __generatePowers(): for i in xrange(5): yield base**i powers= list(__generatePowers())
在这种情况下,很显然,这
base并不适用
__generatePowers;两者都会导致异常(除非您很不幸也有一个
base全局变量,在这种情况下您会得到错误)。
对于列表推导这不会发生,这是由于一些内部细节来评估它们的方式,但是在Python
3中这种行为消失了,在两种情况下都会同样失败。这里有一些讨论。
可以使用lambda的一种解决方法,该技术与我们在nested_scopes出现之前的糟糕年代所依赖的技术相同:
class Brie(object): base= 2 powers= map(lambda i, base= base: base**i, xrange(5))



