Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 Python2.7列表变量名_Python 2.7_List Comprehension_Class Attributes - Fatal编程技术网

Python 2.7 Python2.7列表变量名

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循环一样。当在类定义中使用时,所述局部作用域用于初始化类属性。如果你不想让名字出

我使用列表理解为Python2.7中的class属性赋值。我注意到这添加了列表理解中使用的变量作为类属性

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中的行为让人感觉更干净,并且通常鼓励编写更好的代码。