Python中使用"or"进行赋值

59

这样给变量赋值被认为是不好的编程风格吗?

x = "foobar" or None
y = some_variable or None
在上面的例子中,变量 x 获得了值 'foobar'。

4
"副作用"并不是指这个意思。 - Greg Hewgill
3
@Ramin,我知道您没有分配布尔值。我的意思是,我没有看到任何副作用 - jcollado
4
@Ramin:“有点不寻常的行为”,在计算机科学中,“副作用”有着非常不同的含义。http://en.wikipedia.org/wiki/Side_effect_(computer_science) - joaquin
4
是的,Python 有它们,可怕、黑暗、危险(一位 Haskell 程序员的评价)。 - joaquin
显示剩余4条评论
4个回答

44

不,这是一种常见的做法。仅对远比您的表达更长的表达形式视为不良风格。


2
在JavaScript中,它被认为是一种反模式。对于未经培训的人来说,它不容易理解,并且您无法分配虚假值。 - diginoise
12
@diginoise 对于刚接触编程的人来说,JavaScript 或其他编程语言的语法都不是很自然。但一旦开发者熟悉了短路求值的概念(例如在 JS、Python 和其他许多语言中常用的 if foo or bar...),语法就变得自然了,尽管第一次见到时可能需要思考一下。 然而,“假值”在 Python 中也是一个问题,比如 'list = []; return list or False`。 - cjs

32

这样做的主要危险在于(第二种情况下),some_variable 可能是 False 但不是 None(例如整数 0),在这种情况下,您不想使 y 等于 None。


9

9
我也觉得使用那种表达方式有点不舒服。在《学习Python第四版》中,它被称为“有些不寻常的行为”。 后来马克•卢茨(Mark Lutz)说: “...事实证明,在Python中这是一种相当常见的编码范例:为了从固定大小的集合中选择一个非空对象,只需将它们用or表达式串在一起。更简单的形式也经常用于指定默认值......” 事实上,它们产生了简洁的单行表达式,有助于消除代码中的噪音。 这种行为是if/else三元运算符的基础形式:
A = Y if X else Z

4
但是这可能会导致重复冗长的参数,其中 Y = X。例如:A = my_main_dictionary.my_sub_dictionary.my_value if my_main_dictionary.my_sub_dictionary.my_value else None 或者 A = my_main_dictionary.my_sub_dictionary.my_value or None - Roee Gavirel
2
@RoeeGavirel 只需将 my_value 分配给一个本地变量即可。 - winklerrr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接