2016-05-28 5 views
1

が(下図のように)Pythonで三項演算子を使って変数の割り当てを行う方法があります:割り当て二つの変数

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

何か(x='yes') if(x>1) else (z='yes')等が挙げられるが、これはエラーになります。これを行う他の方法はありますか?

私は、単一の変数の代入は次のように行うことができます知っている:x="yes" if(l==0) else "no"

編集:これが実行される前& zは、いくつかの値が割り当てられているY、Xを想定。

+0

ありませんが、あなたはそれを行うことはできません。また、 'print(' else '条件がない場合は' yes ') 'だけでよいことに注意してください。 – jonrsharpe

+0

@jonrsharpe私は印刷できることを知っています、私は代入文について知りたいと思っていました。なぜそれがサポートされていない特定の理由? –

+0

私の主張は、呼び出しの中でそれを行うことができ、括弧が冗長であることでした。以下に述べるように、あなたは三項に声明を書くことができないからです。 – jonrsharpe

答えて

2

あなたはこのようなexec機能を使用することができます

exec("y='yes'" if x > 1 else "z='yes'") 
+0

いいです。簡単な選択肢。 –

+0

私はこれを3分早く、コードの重複を少なくして、よりハッキリではない選択肢で言いました。どうして? –

+0

少なくとも(私の目には)少しおいしいです: 'exec(" y "ならx> 1 else" z ")+" = 'yes' ")' –

2

いいえ、できません。三項内には、文ではなく式だけができます。 printは(少なくともPython 3では)それが関数呼び出しであるために動作します。割り当ては常にステートメントです。

y, z = ('yes', z) if x > 1 else (y, 'yes') 

は、それらの括弧をお見逃しなく:

+0

具体的な理由はありますか?私はそれが他の言語でサポートされているのはなぜPythonではないのですか? –

+1

@AniMenon Pythonは他の言語ではないのであなたはどんな答えを期待していますか? – jonrsharpe

+0

@jonrsharpe私は言語について何かを期待していたのかもしれません。 "Pythonは他の言語ではありません..." –

4

あなたはタプルのアンパックを採用して、以下のハックを使用することができます。

私はこれを理解するのが難しく、1つの冗長な割り当てステートメントがあり、不必要にアンパックを使用するので、これを使用することをお勧めしません。できるだけどこでも通常のifのステートメントに進んでください。

これは、それがifの通常とどうなるかです:あなたはANに属性を設定したい場合は

globals()[varname] = 'yes' 

:あなたはグローバル変数を割り当てる場合

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

いいです。私は可能性を探していました。 –

+0

しかし、これは両方の名前に何かを割り当てますが、OPコードは1つを未割り当てのままにします。 – jonrsharpe

+0

また、 'y'と' z'がすでに定義されていることを前提としています。 –

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

オブジェクト:

setattr(obj, varname, 'yes') 

それは関数内のローカル変数の場合は、あなたがより多くのハックを取得する必要があります。

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

または

exec(varname + ' = "yes"') 

あなたはもちろん、それを維持するためにこれらのステートメントのすべてに直接varnameの定義を置くことができます1つの行で、私は繰り返しを避けています。

しかし、実際にはこれを実行しないことをお勧めします。それは簡単で簡単です。

+0

私はあなたがなぜ落選したのか分かりません。しかし、私は2つの変数を交互に設定したかった。あなたのコードでは、1つの変数に値を設定しています。 –

+0

@AniMenonあなたは何を意味するのか分かりません。 1つの値で 'y'または' z'を設定しています。私の 'exec'は正しいとマークした答えと全く同じです。単に' 'yes''を二度言わないだけです。 –

+0

あなたのメソッドは+1されました。いいです、ごめんなさい、私は理解する時間がかかりました。 –

関連する問題