可能性のある複製:
グローバル変数を作成した関数以外の関数でグローバル変数を使用
私のプログラムが混乱しないように関数を使用していますが、ローカル変数をグローバルにする方法がわかりません。
同じことを実現する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()`
関数の外で変数を宣言するだけです:
globalValue = 1
def f(x):
print(globalValue + x)
関数内からグローバルにassignする必要がある場合は、global
ステートメントを使用します。
def f(x):
global globalValue
print(globalValue + x)
globalValue += 1
関数の内部状態にアクセスする必要がある場合は、クラスを使用する方が良いでしょう。 __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`
グローバルを使用すると、プログラムが混乱します。それらを回避するために、一生懸命努力することをお勧めします。とはいえ、「グローバル」はPythonのキーワードなので、特定の変数をグローバルとして指定できます。
def foo():
global bar
bar = 32
「グローバル」キーワードが使用されることは非常にまれであるため、デザインを再考することを真剣にお勧めします。
モジュールスコープを使用できます。 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
に再バインドするためです。モジュール属性。