0

同じスクリプトで次のようになります。

class ClassA:
    def GetExpBidBrice():
        global x
        x ='abc'

    def GetExpAskPrice():
        y = x + 'zyz'

class ClassB:
    def GetExpBidBrice():
        x = 123

    def GetExpAskPrice():
        y = x + 'zyz'

globalinは、の他のメソッドに対してグローバルになりますClassA.GetExpBidPrice()か?それとも、それを全面的にグローバルにしますか?つまり、inまたは他のクラスと呼ばれる変数を使用しますか?xClassAClassBx

4

5 に答える 5

3

変数は、現在のコードブロックでのみグローバルになります。globalステートメントドキュメントから:

このglobalステートメントは、現在のコードブロック全体を保持する宣言です。これは、リストされた識別子がグローバルとして解釈されることを意味します。自由変数はグローバルとして宣言されずにグローバルを参照する可能性がありますが、グローバルなしでグローバル変数に割り当てることは不可能です。

他のメソッドの変数xは影響を受けません。メソッド内でのみグローバルになりますClassA.GetExpBidBrice()

他のメソッド(ClassA.GetExpAskPrice()、、ClassB.GetExpBidBrice()およびClassB.GetExpAskPrice())でもグローバルにしたい場合はx、各メソッドで個別にグローバルを宣言する必要があります。

于 2012-11-07T12:14:35.140 に答える
0

global特定の関数でのキーワードの使用は、その関数のスコープ内での変数の使用を、その名前のモジュールレベルのグローバル変数を参照するものとしてマークします。

あなたの例では、宣言だけのメソッドがあっても、他のメソッドで同じ名前を使用しても効果はありません。global

于 2012-11-07T12:15:37.413 に答える
0

関数内で使用されるグローバルキーワードは、その関数ブロックで有効になります。globalは、関数内からグローバル変数を変更/更新するのに役立ちます。

于 2012-11-07T12:19:23.470 に答える
0

I say "throughout the whole script". That means in the namespace where no identation is, right after >>>

>>> def g():
    def f():
        global x
        print x
    return f

>>> f = g()
>>> f.func_globals is g.func_globals
True
>>> f.func_globals is globals()
True
>>> x = 3
>>> f()
3

This second example tells you: it is always the module/script namespace

>>> x = 3
>>> def g():
    x = 0
    def f():
        global x
        print x
        x += 1
    return f

>>> f = g()
>>> f() # would be 0 if x of g was used.
3
>>> f()
4
于 2012-11-07T13:10:08.253 に答える
0

It depends.

Methods that do assignments will create local variables unless they are declared with the global keyword in the same method.

Methods that only read the variable will attempt to read a global by that name. For example:

class ClassA:
    def GetExpBidBrice(self):
        global x
        x ='abc'

class ClassB:
    def GetExpAskPrice(self):
        print(x)

a = ClassA()
b = ClassB()

a.GetExpBidBrice()
b.GetExpAskPrice()

Will display abc.

BUT: if you omit the first method call, and just do:

b = ClassB()
b.GetExpAskPrice()

you get:

NameError: global name 'x' is not defined

Now, if we change to:

def GetExpAskPrice(self):
    x = 'xyz'
    print(x)

this assignment is to a local variable called 'x', it will not affect the global.

于 2012-11-07T13:20:24.080 に答える