在python中用“或”赋值[关闭]
Posted
技术标签:
【中文标题】在python中用“或”赋值[关闭]【英文标题】:Assignment with "or" in python [closed] 【发布时间】:2012-02-03 14:04:42 【问题描述】:这样给变量赋值会被认为是不好的风格吗?
x = "foobar" or None
y = some_variable or None
在上面的示例中,x 获取值 'foobar'。
【问题讨论】:
这不是“副作用”。 @Ramin 我知道您没有分配布尔值。我的意思是我没有看到任何side effect。 @Ramin:“有点不寻常的行为”、“副作用”在计算机科学中的含义非常不同。 en.wikipedia.org/wiki/Side_effect_(computer_science) 是的,Python 拥有它们,可怕、黑暗、危险(Haskeller) 相关:What does an 'x = y or z' assignment do in Python? 【参考方案1】:不,这是一种常见的做法。只有对于比你的长得多的表达式,它才被认为是不好的风格。
【讨论】:
它在 javascript 中被认为是一种反模式。它不会自然地被外行阅读,并且您不能分配虚假值。 @diginoise Javascript 或任何其他语言中的任何内容都不会自然地让外行人阅读。但是一旦开发人员熟悉了捷径评估(例如,if foo or bar...
中使用的,这是 JS、Python 和许多其他语言中相当常见的习语),它就会很自然地阅读,尽管您可能需要考虑你第一次看到它的时候。然而,“假”值在 Python 中也是一个问题,就像 'list = [];返回列表或False`【参考方案2】:
这样做的主要危险是(在第二种情况下)some_variable
为 False 但不是 None(例如整数 0
)并且您不想以 @ 结尾在这种情况下,987654323@ 等于 None。
【讨论】:
【参考方案3】:我也觉得用那种表达方式有点不舒服。在 Learning Python 4ed 中,它被称为“有点不寻常的行为”。 后来 Mark Lutz 说:
...事实证明这是 Python 中相当常见的编码范例: 从固定大小的集合中选择一个非空对象,只需字符串 将它们放在一个 or 表达式中。以更简单的形式,这也是 通常用于指定默认值...
事实上,它们会生成简洁的单行表达式,有助于消除代码中的行噪音。 这种行为是 if/else 三元运算符形式的基础:
A = Y if X else Z
【讨论】:
但它可能会导致重复很长的参数,其中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
@RoeeGavirel 只需将 my_value
分配给局部变量【参考方案4】:
OP 的语法非常好。 “assignment with or”的正式名称是null coalescing,实际上现在有一个关于它的***页面! https://en.wikipedia.org/wiki/Null_coalescing_operator 这个问题也可能有用: Is there a Python equivalent of the C# null-coalescing operator?
【讨论】:
以上是关于在python中用“或”赋值[关闭]的主要内容,如果未能解决你的问题,请参考以下文章