var ||= var_new
那么在Python中如何编写呢?PS: 我不知道“||=”的名称,因此无法在Bing中搜索。
有些人不确定条件赋值运算符(||=
)的作用,也有一些人误解了Ruby中变量的生成方式。大家应该阅读这篇文章来了解这个主题。引用其中一句话:
一个普遍的误解是,
a ||= b
等同于a = a || b
,但它的行为类似于a || a = b
在
a = a || b
中,每次运行语句都会将a
设置为某个值,而在a || a = b
中,只有当a
逻辑上为false时(即如果它是nil或false),才会设置a
,因为||
是“短路”的。也就是说,如果||比较的左边为true,则无需检查右边。
还有一个非常重要的提示:
......即使没有运行,变量赋值也会立即召唤该变量存在。
# Ruby
x = 10 if 2 == 5
puts x
尽管第一行不会被执行,但是变量x将在第二行存在,并且不会引发任何异常。
这意味着Ruby将绝对“确保”在任何右侧条件发生之前有一个变量容器可以放置值。如果a
未定义,则||=
不会进行赋值;如果a
为假值(再次提醒,false
或nil
-nil
是Ruby中默认的“无”的值),它将进行赋值,同时保证a
已定义。
好吧,如果a
被定义了,接下来的代码:
# Ruby
a ||= 10
实际上等同于:
# Python
if not a:
a = 10
以下是:
# Either language
a = a or 10
虽然 "is close" 与之前的示例相似,但它总是分配一个值,而前面的示例没有。
如果a
未定义,则整个操作更接近于:
# Python
a = None
if not a:
a = 10
当 a
未定义时,a ||= 10
的一个非常明确的例子是:
# Ruby
if not defined? a
a = nil
end
if not a
a = 10
end
归根结底,||=
运算符在任何“Pythonic”方式下都不能完全地被翻译为 Python,因为它依赖于 Ruby 中底层变量的生成。
a=None; if not a: a=10
后,a 肯定是 10,对吗?还不如直接写成 a=10
。 - dawgif not 'var' in globals():
这样的写法,现在简化了一点。 - ZK Zhao||=
的解释是错误的。能不能有更熟悉 Ruby 的人修改一下问题,正确地说明该操作符的行为呢? - wimif not var_name:
,pylint 也会抱怨您在变量声明之前使用了它。编辑:算了,似乎是我的作用域问题,在函数中使用但在外部定义(这本来就不好,但我想缓存一个变量/查找)。 - CTS_AE在Python中,没有特别优雅的方法,因为把自己陷入不知道变量是否存在的情况并不是特别优雅的做法。然而,以下方法似乎最接近:
try:
var
except NameError:
var = var_new
我不熟悉 Ruby 中的 ||=
运算符,但从你所描述的来看,这个块应该具有正确的行为。也就是说,如果 var
已经存在,则我们保留其绑定状态;否则,我们将其设置为 var_new
。
_ = var
,这样你就不会在控制台上得到无意义的输出。 - Mark Ransomvar = var or var_new
对于Python中“不存在”的变量,其规则非常严格;如果未给var
赋值,则会抛出异常。然而,如果var
求值为falsey,将会接受var_new
的值。
我说这是“惯用法”,因为在Python中,这种情况的惯用较大结构如下:
var1 = None
var2 = None
var3 = None
# ... code here that may or may not set var1 through var3 ...
var1 = var1 or "default1"
var2 = var2 or "default2"
var3 = var3 or "default3"
var
未被赋值为零、False或任何被认为是“空”的对象(例如""
,[]
,{}
等)时,该结构才有效。如果你真的想要它仅在None上触发,你必须写更冗长的代码。var = var if var is not None else var_new
相反,我通常会寻找另一种解决更大问题的方法,而不是这样做。
最后,如果你能像这样组织你的代码...
var1 = "default1"
var2 = "default2"
var3 = "default3"
# ... code here that may or may not set var1 through var3 ...
如果可以的话,你应该这样做,因为这样更短小精悍,更简单易懂,并且避免了None与falsey问题。
a
不存在,a=a or 10
仍然会产生NameError。而在Ruby中,a||=10
会创建名为a
的变量(如果它不存在),并将10赋值给它。 - dawgvar = locals().get('var', var_new)
globals()
中进行检查以获得完整的解决方案... - Corley Brigmanvar = locals().get('var') if 'var' in locals().keys() else globals().get('var',var_new)
可以处理这两个。 - user380772try: var
except NameError: var = var_new
或者
var = locals().get('var', var_new)
try
except
可能是最接近的。 - dawgvar
是否已经在当前作用域中被定义了?在 Python 中,这是一件通常会尽力避免的事情。或者只是var
是空的,就像 Python 中的None
一样? - Marius