python
  • variables
  • memory
  • local
  • instantiation
  • 2012-01-10 3 views 7 likes 
    7

    変数の名前(文字列)のみを指定してPythonコードでローカル変数を作成することは可能ですか?それで、locals()の "xxx"を後で呼び出すとTrueを返します。ここでPythonでローカル変数を「動的に」作成することは可能ですか?

    は、視覚的です:私はこの策略は完全に別のトピックである必要が

    >>> 'iWantAVariableWithThisName' in locals() 
    False 
    >>> junkVar = 'iWantAVariableWithThisName' 
    >>> (...some magical code...) 
    >>> 'iWantAVariableWithThisName' in locals() 
    True 
    

    目的のために...助けを

    感謝。

    +0

    それはに対して警告されていますが、exec関数を使ってPython 2.xの中で行うことができます - ではなく3.0で:http://stackoverflow.com/questions/1450275/modifying-locals-in-python – philofinfinitejest

    +3

    "どのような目的のために、このトリッキーが必要なのは、まったく別の話題です..." - **無限に重要です**。あなたが本当にやりたいことに関係する質問を、あなたがそれをやりたいと思う方法に関係する質問に尋ねないでください。 –

    +0

    Karl:MitchellSaladは下のコメントに、代わりに辞書を使用していることをメモします。これは良い選択です。 –

    答えて

    9

    あなた本当にあなたはexec使用することができ、これをしたい場合:もちろん

    print 'iWantAVariableWithThisName' in locals() 
    junkVar = 'iWantAVariableWithThisName' 
    exec(junkVar + " = 1") 
    print 'iWantAVariableWithThisName' in locals() 
    

    を、誰もが幹部をされて使用してどのように危険なハックを教えてくれますが、その後ので、この任意の実装になります"トリッキー"

    +1

    Heh。たとえ斜体の使用に至るまで、非常によく似た文章を使用しました。 - OPがおそらくこれをしてはならないことを示すために。 – DSM

    +0

    はい、あなたの設定でjunkVarがNoneに設定されていて、鉱山で1に設定されています。これですべての違いが生じます。 :) +1 to yours –

    +0

    これは、ローカル最適化を無効にするため、Python 2でのみ機能します。 *これを行うと、あなたの関数は遅く実行されます*。 Python 3ではまったく動作しません。 –

    6

    ゲームをプレイしたり、地域()を手動で更新したりすることができますが、これはうまくいくことがありますが、そうしないでください。それは特に文書で警告されています。私これを行うためにを持っていた場合、私はおそらくexecを使用したい:百のうち

    >>> 'iWantAVariableWithThisName' in locals() 
    False 
    >>> junkVar = 'iWantAVariableWithThisName' 
    >>> exec(junkVar + '= None') 
    >>> 'iWantAVariableWithThisName' in locals() 
    True 
    >>> print iWantAVariableWithThisName 
    None 
    

    しかし九〇から三回あなたが本当に代わりに辞書を使いたいです。

    +0

    応答に感謝します。この特定のインスタンスでは、私のコードが生成する膨大な数の変数名のために、exec呼び出しは辞書を管理するよりももっと美味しいものになります。 execによって「時には」働くことが何を意味するのか、もう少し詳しく説明できますか?編集:辞書は正常に動作します。詳しく説明する必要はありません。 :) – MitchellSalad

    +0

    「時には」働くのは、ローカル辞書を更新することです。例えば: 'locals()[" myvar "] = 1'です。 [docs](http://docs.python.org/library/functions.html#locals)は、次のように言っています: "注意:この辞書の内容は変更しないでください。変更は使用されるローカル変数とフリー変数の値に影響しません通訳者によって。 –

    +1

    @MitchellSalad:いいえ、私は地方()(すなわち[] junkVar '] = 99 - を更新することはわずかに危険で、推奨されない.. execはセキュリティ上の問題にもかかわらずうまくいくはずです。私はあなたの味を分かち合っているのかどうかはわかりません。私が持っていた変数が多ければ多いほど、それらを辞書に包む可能性が高くなります。 – DSM

    -1

    execを使用する必要はありませんが、locals()[string]、またはvars()またはglobals()も機能します。

    test1="Inited" 
    
    if not "test1" in locals(): locals()["test1"] = "Changed" 
    if not "test1" in locals(): locals()["test2"] = "Changed" 
    
    print " test1= ",test1,"\n test2=",test2 
    
    +1

    これを関数で試してみてください。うまくいきません。 – pyrospade

    関連する問題