使用三元运算符为两个变量赋值

6

有没有一种方法可以在Python中使用三元运算符进行变量赋值(如下所示):

if(x>1):
    y="yes"
else:
    z="yes"

类似于(x='yes') if(x>1) else (z='yes'),但是这会导致错误。还有其他的方法吗?

我知道可以像这样进行单变量赋值:x="yes" if(l==0) else "no"

编辑:假设在运行此代码之前已经给x、y和z分配了某些值。


不,你不能这样做。另外,请注意,你可以使用 print('yes' if condition else 'no') - jonrsharpe
@jonrsharpe 我知道我们可以打印,我想知道的是关于赋值语句。为什么不支持它有任何特定的原因吗? - Ani Menon
我的意思是你可以在调用内部完成它,而括号是多余的。如下所述,因为你不能在三元运算符中使用语句。 - jonrsharpe
@jonrsharpe 很酷。我希望这个功能很快就能添加上。 - Ani Menon
1
为什么?这会导致代码变得更加复杂;在这些语句之后,您必须再次检查相同的条件,以确定分配给哪个名称以避免“NameError”。这在哪里有用? - jonrsharpe
@jonrsharpe 例如:如果x>5,则使z=10,否则y=10(让z保持不变)。问题是你能否用一条语句完成。无论如何,我得到了答案。 - Ani Menon
4个回答

9
您可以使用以下技巧,利用元组拆包:
y, z = ('yes', z) if x > 1 else (y, 'yes')

别忘了那些括号。

我不建议使用这种写法,因为它更难理解,有一个多余的赋值语句,而且使用了不必要的解包。我建议在任何情况下都使用普通的if语句。

这是使用普通的if语句的写法:

if x > 1:
    y = 'yes'
    z = z
else:
    y = y
    z = 'yes'

不错。我正在寻找可能性。 - Ani Menon
但是这会将某些东西分配给两个名称,而OP的代码则使一个名称未被分配。 - jonrsharpe
@AlexHall 我考虑了问题中的这一行代码:(x='yes') if(x>1) else (z='yes')。我会编辑答案。 - EvilTak
而且,yz本来就必须被定义,因为在单行 if 中初始化变量是没有用的,如果 if 没有执行,那么值是不存在的。 - EvilTak
@EvilTak,谢谢你。这是一个非常好的技巧。 - Ani Menon
@AlexHall 是的,yzx都已定义。 - Ani Menon

2
不,你不能这样做。三元运算符内只能有表达式而不是语句。在Python 3中,print可以工作,因为它是一个函数调用,因此是一个表达式;但赋值总是一个语句。

有什么具体的理由吗?我的意思是,其他编程语言都支持它,为什么Python不支持呢? - Ani Menon
1
@AniMenon 因为Python不是那些其他的语言?你期望什么样的答案呢? - jonrsharpe
@jonrsharpe 我原本期望的是关于编程语言的内容,也许不是那种“Python不是其他语言...”的说法。 - Ani Menon
@AniMenon 你说的“关于语言的某些事情”是什么意思?显然,不同的编程语言在追求不同目标时做出了不同的权衡。这是显而易见的。 - jonrsharpe
@AniMenon:为什么不呢?因为Python鼓励良好的编程习惯,所以清晰的代码比产生另一种方法更重要。你也不能省略缩进,但在其他语言中可以这样做。 - cdarke
@cdarke,我只是想知道是否可能,如果不可能,为什么不可能。看起来有一些黑客技巧。太酷了 :) - Ani Menon

2
varname = 'y' if x > 1 else 'z'

如果您想分配一个全局变量:
globals()[varname] = 'yes'

如果您想在对象上设置属性:

setattr(obj, varname, 'yes')

如果它是函数内的局部变量,你需要更加巧妙地处理:

exec('%s = "yes"' % varname)

或者

exec(varname + ' = "yes"')

当然,你可以直接在所有这些语句中放置varname的定义,以使其保持在一行中,我只是避免重复。

但实际上最好不要这样做。保持简单和直接。


@AniMenon 我不知道你的意思。我正在使用一个值来设置yz。我的exec与你标记为正确答案的完全相同,只是没有两次提到"yes" - Alex Hall
我现在明白你的方法了+1。不错,抱歉我花了点时间理解。 - Ani Menon

1
您可以像以下方式使用exec函数:
exec("y='yes'" if x > 1  else "z='yes'")

不错。简单替代方案。 - Ani Menon
我之前说过同样的话,提供了更少的代码重复和其他不那么hacky的替代方案,但却被downvote了。为什么? - Alex Hall
稍微好看一点(至少在我看来):exec(("y" if x > 1 else "z") + "='yes'") - Amit Gold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接