3

Python で次のようなことができることを知っています。

var = value1 if( booleanCheck() ) else value2

私が知りたいのは、同様の種類の構造で値を配置する変数を条件付きで選択できるかどうかです。

このようなもの:

(var1 if( booleanCheck() ) else var2) = value

私の場合、具体的には、子ノードを二分探索ツリーの正しい側に割り当てようとしています。通常の if ブロックを実行できることはわかっていますが、最小限のスペースを使用することに挑戦しようとしていました。

4

4 に答える 4

4

理論的には、両方の変数が既に定義されている場合、次のようなことができます。

var1, var2 = (value, var2) if booleanCheck() else (var1, value)

やるべきだとは言いませんが。

于 2013-07-24T13:18:00.883 に答える
2

ユースケースはバイナリツリーの正しい側に割り当てているため、割り当てターゲットは実際にはツリーノードの属性であると想定し、通常のコードは次のようになります

if condition:
    node.left = value
else
    node.right = value

このコードは次のように置き換えることができます

setattr(node, "left" if condition else "right", value)

または代わりに

vars(node)["left" if condition else "right"] = value

これで置き換えることができますが、実際にはそうすべきではありません

于 2013-07-24T13:57:34.250 に答える
1

localsこの方法で使用するのはあまり良い形式globalsではありません (混乱する、あまり使用されない、デバッグが難しい、ひどいパフォーマンス) が、実行できます。

varname = 'a' if some_condition else 'b'
locals()[varname] = value # or globals()
print locals()[varname] # or globals()

ここでの本当の課題は、一見「派手」または「創造的」なコードに抵抗し、他の人がすぐに理解できるコードを書くことだと思います。後で戻ってくる必要がある場合は、自分自身は言うまでもありません。しかし、ファンキーなコード (古いチーズのように) がどのようなものかを知ることは価値があります。

于 2013-07-24T13:18:11.260 に答える
0

とは異なりlocals()globals()は更新可能であると文書化されています (__dict__現在のモジュールの を返すため)。コードの重複を減らすためvars() に、グローバルスコープで定期的に使用します-その場合も同じです:

for v,ar in ('a',x),('b',y): vars()[v]=fn(ar)

他のいくつかのオブジェクト (現在のクラス/インスタンスなど) については、__dict__のメンバーも構文変数としてアクセスできます。

class C:
    def __init__(self,a,b):
        vars(self).update(v,locals()[v] for v in 'a','b')
        do_something(self.a)

ただし、次の点に注意してください。

  • これらの「構文参照」は、見つけにくくなるため、コードの保守性を低下させ、pylint.
  • そのような方法で変数を使用する必要性は、通常、スコープを として使用する試みを意味しますdictそのような変数は、何らかの方法で「同種」である傾向があり、配列操作で使用されることを要求するため、おそらく専用のコンテナーに結合する必要があります。代わりは。
于 2015-12-17T12:25:34.450 に答える