3

このコードを実行すると:

a = '1'
vars()['a'] = '2'
print a

次の出力が得られます。

2

しかし、このコードを実行すると:

def bar():
    a = '1'
    vars()['a'] = '2'
    print a

bar()

次の出力が得られます。

1

ここで私の質問は、なぜそれが起こるのか、2 番目のケースで最初のケースと同じ解決策を得るにはどうすればよいかということです。

編集:

本当に解決策を見つけることができませんでしたが、その周りに小さなハックを見つけました... exec は使用しませんが:

def bar():
    a = "a"
    b = "b"
    exec a+"="+b
    print a

bar()

結果は次のとおりです。

b

誰かがより良い解決策を見つけることができれば、それは素晴らしいことです。この方法でグローバル変数を設定したり、おかしなことをしたりしているわけではないので、心配しないでください。

4

2 に答える 2

2

__dict__新しいスタイル クラスがデフォルトの動作をオーバーライドするように見えるため、 vars(). 古いスタイルのクラスに影響する理由は定かではありませんが、関連している可能性があります。

ドキュメントから (http://docs.python.org/library/functions.html#vars):


vars([object])__dict__モジュール、クラス、インスタンス、または属性を持つその他のオブジェクト の属性を返し__dict__ます。

モジュールやインスタンスなどのオブジェクトには、更新可能な__dict__属性があります。ただし、他のオブジェクトでは属性に書き込み制限がある場合があり__dict__ます (たとえば、新しいスタイルのクラスは dictproxy を使用して辞書の直接更新を防ぎます)。

引数がない場合、vars() は locals() のように機能します。locals ディクショナリへの更新は無視されるため、locals ディクショナリは読み取りにのみ役立つことに注意してください。


クラスのケースでうまくいかない理由についてコメントしていただけますself. = valか?setattr(self, 'x', val)

于 2012-04-23T20:32:50.807 に答える
1

の結果への代入vars()は定義されていません。そのため、シナリオや Python のバージョンや実装が異なると、結果が異なる可能性があります。この方法を使用してローカル変数を変更できるのはぞっとするかもしれませんが (正規表現の groupdict の結果に一度使用してみました)、これは非常に移植性が低く、いつでも壊れる可能性があります。

于 2012-04-23T23:41:43.353 に答える