在赋值时提供回退值的最Pythonic方法是什么?

35 投票
9 回答
18428 浏览
提问于 2025-04-15 11:11

在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 

如果你还想在空字符串、false0等情况下进行回退:

a = x if x else y 

或者

a = x or y 

关于未定义的情况(也就是从未定义过,或者说没有绑定):

try:
  a = x 
except NameError:
  a = y

或者有点黑科技的做法(我不太推荐这种,但它很简短):

a = vars().get('x',y)

撰写回答