2009-03-26 6 views
2

ローカルメンバーの作成/変更()が関数内で機能しないのはなぜですか?Python:locals()を使用して関数内の現在のスコープを変更できないのはなぜですか?

Python 2.5 (release25-maint, Jul 20 2008, 20:47:25) 
[GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 

>>> # Here's an example of what I expect to be possible in a function: 
>>> a = 1 
>>> locals()["a"] = 2 
>>> print a 
2 

>>> # ...and here's what actually happens: 
>>> def foo(): 
... b = 3 
... locals()["b"] = 4 
... print b 
... 
>>> foo() 
3 
+1

なぜこのようなことをしたいですか? –

+0

外部から取り込まれたデータを使って変数のロードを初期化したかったのです。だから私のアイデアだった: 1つの宣言「=なし」として、すべての変数 2はVARNAMEのマッピングを作成します - >外部ソースパス 3反復マップ、変数を設定したり、エラー で中止しかし、私は私の変数を設定する問題に走りました。 – RobM

+0

古い質問を復活させて申し訳ありませんが、私は同じことをしたい:私は辞書を持っていて、私はその辞書のすべての要素をローカル変数に変えたい(options.fooの代わりにfooと言うことができる)。私は今これを行うためにevalを使用していますが、それは醜いです。他の方法はありませんか? – GaryO

答えて

7

なぜでしょうか?それは表現を返すように設計されており、地元の人々の編集を意図したものではありません。 documentationが警告しているように、そのようなツールとして働くことはこれまで保証されていません。

+0

ああ、私はオンラインヘルプ()しか読んでいないので、私はそれを逃した。ありがとう。 – RobM

+0

@Devin、それはあなたが同様の方法でグローバルを変更できるので、それは最も驚くべき振る舞いです。 – allyourcode

+1

これは公正な申し立てです。 Pythonはこれを不可能にするような方法でローカルアクセスを高速化するのに対し、グローバル名前空間はそのような最適化を行いません(これはPEP 266などで提案されています)。それは間違いなく漏れる抽象である。私の個人的な好みは、ローカル()がグローバル()のように動作するようにするのではなく、ローカル()が今のように動作するようにすることです。それにもかかわらず、私の答えは、直観への言及よりも、ドキュメントに対する卑劣な言及であった。それはそれをしないでしょう。 –

3

locals()は名前空間のコピーを返します(これはglobals()とは逆です)。つまり、locals()によって返されたディクショナリで行った変更は無効です。例4.12のdive into pythonにチェックインしてください。

+0

これはドキュメントではなく、Pythonに潜んでいます。 –

+0

あなたが正しいです :) –

関連する問題