在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 NoneA = 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中用“或”赋值[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中用单引号或双引号提取字符串

Oracle中用子查询创建临时表 并赋值数据

msvc/gcc:中用#pragma指令关闭特定警告(warning)

python笔记4

mysql 进:在存储过程中用select 如何给变量赋值

在python中用floordiv除负数[重复]