Python相当于Ruby的|| =

cqc*_*991 16 ruby python

要检查变量是否存在,并且如果退出,请使用原始值,否则,使用分配的新值.在红宝石中,它是 var ||= var_new

如何在python中编写它?

PS:我不知道name||=,我根本无法在Bing搜索.

Oka*_*Oka 24

我认为那些不确定条件赋值运算符(||=)的人是否存在一些混淆,以及对如何在Ruby中生成变量的一些误解.

每个人都应该阅读这篇关于这个主题的文章.TLDR报价:

一个常见的误解是|| = b等于a = a || b,但它的行为类似于|| a = b

在a = a ||中 b,a在每次运行时由语句设置为某个值,而使用|| a = b,a仅在a逻辑上为假(即,如果它为零或假)时才设置,因为|| 是'短路'.也就是说,如果是||的左侧 比较是真的,没有必要检查右侧.

另一个非常重要的说明:

......变量赋值,即使没有运行,也会立即将该变量召唤出来.

# Ruby
x = 10 if 2 == 5
puts x
Run Code Online (Sandbox Code Playgroud)

即使第一行不会运行,x也将存在于第二行,并且不会引发异常.

这意味着Ruby绝对会确保在任何正确的条件发生之前有一个值的变量容器.||=如果不分配a没有定义,其指定如果a是falsy(再次,falsenil- nil被默认虚无 Ruby中值),而确保a 定义.

这对Python意味着什么?

好吧,如果a已定义,则以下内容:

# Ruby
a ||= 10
Run Code Online (Sandbox Code Playgroud)

实际上相当于:

# Python
if not a:
    a = 10
Run Code Online (Sandbox Code Playgroud)

而以下内容:

# Either language
a = a or 10
Run Code Online (Sandbox Code Playgroud)

很接近,但它总是分配一个值,而前面的例子没有.

如果a没有定义,整个操作更接近:

# Python
a = None
if not a:
    a = 10
Run Code Online (Sandbox Code Playgroud)

因为未定义a ||= 10when 的非常明确的例子a是:

# Ruby
if not defined? a
    a = nil
end

if not a
    a = 10
end
Run Code Online (Sandbox Code Playgroud)

在一天结束时,||=操作符不能以任何"Pythonic"方式完全转换为Python,因为它依赖于Ruby中的底层变量生成.

  • 听起来好像对原始问题中`||=` 的作用的解释是错误的。更熟悉 ruby​​ 的人可以编辑问题以正确说明该操作员的行为吗? (2认同)

wim*_*wim 5

在python中没有特别优雅的方式,因为让自己进入一个你不知道变量是否存在的情况并不是特别优雅.但是,这似乎最接近:

try:
    var
except NameError:
    var = var_new
Run Code Online (Sandbox Code Playgroud)

我不熟悉||=ruby中的运算符,但是根据你所描述的,这个块应该具有正确的行为.也就是说,var如果它是一个已经存在的变量,我们保持绑定,var_new否则我们将其设置为.