web-dev-qa-db-ja.com

ローカル変数(関数内)をグローバルにする方法

可能性のある複製:
グローバル変数を作成した関数以外の関数でグローバル変数を使用

私のプログラムが混乱しないように関数を使用していますが、ローカル変数をグローバルにする方法がわかりません。

29
user1396297

同じことを実現する2つの方法を次に示します。

パラメータを使用してリターン(推奨)

def other_function(parameter):
    return parameter + 5

def main_function():
    x = 10
    print x    
    x = other_function(x)
    print x

main_functionを実行すると、次の出力が得られます

>>> 10
>>> 15

グローバルを使用する(これを実行しない)

x = 0   # The initial value of x, with global scope

def other_function():
    global x
    x = x + 5

def main_function():
    print x    # Just printing - no need to declare global yet
    global x   # So we can change the global x
    x = 10
    print x
    other_function()
    print x

今、あなたは得るでしょう:

>>> 0    # Initial global value
>>> 10   # Now we've set it to 10 in `main_function()`
>>> 15   # Now we've added 5 in `other_function()`
27
Alex L

関数の外で変数を宣言するだけです:

globalValue = 1

def f(x):
    print(globalValue + x)

関数内からグローバルにassignする必要がある場合は、globalステートメントを使用します。

def f(x):
    global globalValue
    print(globalValue + x)
    globalValue += 1
13
Greg Hewgill

関数の内部状態にアクセスする必要がある場合は、クラスを使用する方が良いでしょう。 __call__を定義することにより、クラスインスタンスを呼び出し可能にすることで、クラスインスタンスを関数のように動作させることができます。

class StatefulFunction( object ):
    def __init__( self ):
        self.public_value = 'foo'

    def __call__( self ):
        return self.public_value


>> f = StatefulFunction()
>> f()
`foo`
>> f.public_value = 'bar'
>> f()
`bar`
9
Matthew Trevor

グローバルを使用すると、プログラムが混乱します。それらを回避するために、一生懸命努力することをお勧めします。とはいえ、「グローバル」はPythonのキーワードなので、特定の変数をグローバルとして指定できます。

def foo():
    global bar
    bar = 32

「グローバル」キーワードが使用されることは非常にまれであるため、デザインを再考することを真剣にお勧めします。

6
Arafangion

モジュールスコープを使用できます。 utilsというモジュールがあるとします:

f_value = 'foo'

def f():
    return f_value

f_valueは、インポートする他のモジュールによって変更できるモジュール属性です。モジュールはシングルトンであるため、1つのモジュールからutilsへの変更は、それをインポートした他のすべてのモジュールからアクセスできます。

>> import utils
>> utils.f()
'foo'
>> utils.f_value = 'bar'
>> utils.f()
'bar'

関数は名前でインポートできることに注意してください。

>> import utils
>> from utils import f
>> utils.f_value = 'bar'
>> f()
'bar'

しかし、属性ではありません:

>> from utils import f, f_value
>> f_value = 'bar'
>> f()
'foo'

これは、モジュール属性によって参照されるオブジェクトにローカルスコープ内でf_valueとしてラベルを付けているが、関数barがまだ参照している間に文字列fに再バインドするためです。モジュール属性。

4
Matthew Trevor