Python 2.7 Python2.7列表变量名
我使用列表理解为Python2.7中的class属性赋值。我注意到这添加了列表理解中使用的变量作为类属性Python 2.7 Python2.7列表变量名,python-2.7,list-comprehension,class-attributes,Python 2.7,List Comprehension,Class Attributes,我使用列表理解为Python2.7中的class属性赋值。我注意到这添加了列表理解中使用的变量作为类属性 class MyClass: some_strings = [s for s in ('Foo','Bar')] print MyClass.s Output: 'Bar' #?? 有人能解释为什么会这样吗?在那里使用列表理解有什么问题吗?没有什么问题。使用列表理解将其变量添加到局部范围,就像for循环一样。当在类定义中使用时,所述局部作用域用于初始化类属性。如果你不想让名字出
class MyClass:
some_strings = [s for s in ('Foo','Bar')]
print MyClass.s
Output: 'Bar' #??
有人能解释为什么会这样吗?在那里使用列表理解有什么问题吗?没有什么问题。使用列表理解将其变量添加到局部范围,就像
for
循环一样。当在类定义中使用时,所述局部作用域用于初始化类属性。如果你不想让名字出现在你的课堂上,你必须del
这个名字s
class MyClass:
some_strings = [s for s in ('Foo','Bar')]
del s
请注意,在Python3(使用3.4测试)中,列表理解不会将其变量添加到本地范围。
我们还在Python3中做了另一个更改,以改进列表理解和生成器表达式之间的等价性。在Python 2中,列表理解将循环控制变量“泄漏”到周围的范围中:
x='之前'
a=[x代表1,2,3中的x]
打印x#这打印的是“3”,而不是“之前”
这是列表理解最初实现的产物;这是Python多年来“肮脏的小秘密”之一。一开始,它是一种有意的妥协,让人们盲目地快速理解列表,虽然这对初学者来说不是一个常见的陷阱,但它确实偶尔会刺痛人们。对于生成器表达式,我们无法执行此操作。生成器表达式使用生成器实现,生成器的执行需要单独的执行框架。因此,生成器表达式(特别是当它们在短序列上迭代时)的效率低于列表理解
然而,在Python3中,我们决定使用与生成器表达式相同的实现策略来修复列表理解的“肮脏小秘密”。因此,在Python3中,上面的示例(修改为使用print(x):-)将打印'before',证明列表中的'x'暂时隐藏,但不会覆盖周围范围中的'x'
我不知道。我正在将一些Python3代码翻译成Python2,我遇到了一个奇怪的错误,这是由于列表中的变量覆盖了一个属性。蟒蛇3的行为绝对是一个明智的改进!我很惊讶,我从来没有在蟒蛇2的常见陷阱中看到…@JacquesGaudin,当我遇到相反的效果时,我真的很惊讶——一些东西在我预期的时候没有被覆盖。有点不正常。。。我同意Py3中的行为让人感觉更干净,并且通常鼓励编写更好的代码。