【发布时间】:2018-10-18 04:20:54
【问题描述】:
我目前正在将 codebase 从 python2 切换到 python3 并遇到一个我不太明白的问题:
class MyClass:
var1 = True
var2 = tuple([i for i in [1, 2,] if var1])
上面的类在python2中运行得非常愉快,但是在python3中就坏了。
我改成了:
class MyClass:
var1 = True
var2 = tuple(i for i in [1, 2,] if var1)
因为我的理解是列表理解是多余的,不管它不起作用。经过一些调查后,list/tuple 理解的行为方式似乎是我不太理解的,当它们位于正在初始化的类的主体中时。
# Breaks in python 2 and 3
class MyClass:
var1 = True
var2 = tuple(i for i in [1, 2,] if var1)
# Works in python 2, breaks in 3
class MyClass:
var1 = True
var2 = [i for i in [1, 2,] if var1]
关于发生了什么的任何指示?
【问题讨论】:
-
我不认为这个问题与附加的副本完全重复,但除非其他人这样做,否则我不会重新打开它。
-
@Kasramvd 你能详细说明一下吗?我认为 Martijn 的回答涵盖了 OP 可能想知道的所有内容。
-
@Aran-Fey 是的,这个答案很全面,但我的意思是这个问题不是重复的。重复基本上是为了问题。尽管有人可以争辩说,当您可以在其他不重复的问题中找到答案时,那么不重复它有什么意义。但是,当你基于一个特定的根启动一个线程时,它会导致它自己的结果,此外,对于这样的问题,因为自 3.1 以来有许多新版本的 Python 并且所有这些都有很多新特性,一个可以提出更多更新的答案。
-
@Aran-Fey 总而言之,我的意思是,像这样解决语言的一些基本问题的重要而好的问题总是值得讨论和审查。
-
@Kasramvd 我现在明白了,你说这是一个不同的问题,因为它询问列表理解和生成器表达式之间的区别。不过,我认为这还不足以成为重新提出问题的充分理由。它只是对问题 “为什么这个列表推导在 python2 中有效,但在 python3 中无效?” - 这是因为列表推导在 python2 中没有自己的范围,但生成器表达式有. “为什么列表推导式与生成器表达式不同?” 的答案实际上只是 “因为它们是不同的表达式”。
标签: python python-3.x class namespaces