関数は、呼び出し元のスコープを使用する必要があることを宣言するための方法はありますか?

Archop:

あなたは、コードのその部分のために別々のスコープを作成せずに、インライン方式でコードを再利用することができますどのCマクロに似feautreはありますか?

例えば:

a=3
def foo():
    a=4
foo()
print a

私はそれが4を印刷したいしかし、3を出力します。

私は単に私が代わりに、呼び出し元の範囲内の変更を加えてみましょうだろう(例えば、関数デコレータのような)より原始的な解決策を探していますが、クラスやグローバル辞書のようなオブジェクトを含むソリューションを認識しています。

どうもありがとうございました

編集:私は使用しようとしてOR mutabaleオブジェクトなどの「名前空間」を宣言していた変数を宣言する必要が任意のソリューションは、事前に私が探しているソリューションではありません。

jsbueno:

この場合、単に使用しglobalたキーワードを:

a=3
def foo():
    global a
    a=4
foo()
print (a)

それがグローバルであれば、外側のスコープを変更します。

外側のスコープを用いて行われる機能である場合nonlocalはPython 3.0で導入された-その代わりキーワード。

動的スコープ

呼び出し元関数のスコープを変更すると、しかし、パイソンの前提ではなく、言語の特性です。

それはすることができます行うこと。しかし、単に民間のC APIの呼び出しによって(ベークへ」を地元の人々の価値観は、高速なローカル変数に戻す)とdefinettely良い習慣ではありません。

魔法のデコレータを通してそれをやってすることも可能であろうが、デコレータは、内側の関数にバイトコードを書き換えなければならないだろう- caler上の値を取得し、更新することにより、「非ローカル」変数への各アクセスを交換することによってlocals、そして、最後に-機能のhttps://programtalk.com/python-examples/ctypes.pythonapi.PyFrame_LocalsToFast/

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=398973&siteId=1