在赋值时提供回退值的最Pythonic方法是什么?
在Perl中,有时候我们希望给一个对象赋值,但如果赋值的变量是'undef'(也就是没有值),我们还想指定一个备用值。比如:
my $x = undef;
my $y = 2;
my $a = $x || $y;
在这之后,
$a == 2
如果在Python中,想要实现类似的功能,当值x是None时,有没有简单的方法?还是说需要用更复杂的方式来实现呢?
if x is not None
a = x
else
a = y
...这样做才算是最符合Python风格的方法吗?
补充说明:抱歉,正如几位评论者指出的,我其实并不是在说值是未定义的,而是Perl中的'undef',这并不完全一样。不过我最开始提问时并没有说清楚这一点。
9 个回答
4
我想对你的Perl示例做一些小的挑剔:
my $x = undef;
这段多余的代码可以简化成:
my $x;
而下面这段代码并没有你所说的那样工作:
my $a = $x || $y;
实际上,当$x是false时,这段代码会把$y的值赋给$a。false的值包括像undef
、零和空字符串这样的东西。如果你只想检查变量是否被定义,可以这样做(从Perl 5.10开始):
my $a = $x // $y;
6
首先,你可以用三元运算符来完成你的需求:
a = y if x is None else x
不过,这并不能解决你的问题。你想要做的事情,更适合用下面的方式来实现:
try:
a = x
except:
a = y
60
从2.5版本开始:
如果你只想在值为None的时候进行回退:
a = x if x is not None else y
如果你还想在空字符串、false
、0
等情况下进行回退:
a = x if x else y
或者
a = x or y
关于未定义的情况(也就是从未定义过,或者说没有绑定):
try:
a = x
except NameError:
a = y
或者有点黑科技的做法(我不太推荐这种,但它很简短):
a = vars().get('x',y)