5

このようなことをしたいのですが、SyntaxWarning が表示され、期待どおりに動作しません

RAWR = "hi"
def test(bool):
    if bool:
        RAWR = "hello"   # make RAWR a new variable, don't reference global in this function
    else:
        global RAWR
        RAWR = "rawr"    # reference global variable in this function
    print RAWR           # if bool, use local, else use global (and modify global)

これを機能させるにはどうすればよいですか?True または False を渡すと、グローバル変数が変更されます。

4

2 に答える 2

5

それはいけません。スコープ内では、特定の名前は、ローカル変数または非ローカル (たとえば、グローバルまたは外部関数からの) 変数のいずれかを参照します。両方ではありません。このglobal RAWR行はRAWR、変数への割り当てがスコープ全体に対してローカルになるのと同じように、スコープ全体に対してグローバルを作成します (そのため、警告が表示されます。思ったとおりに動作しません)。編集: veredesmarald のおかげで、実際には Python 2 の構文エラーであることがわかりました。私の回答のこの半分は、明らかに Python 3 にのみ適用されます。

別の名前のローカル変数を使用し、それをグローバルに「昇格」させたいブランチで、グローバル変数ローカル変数を設定するだけです。(または、グローバルをまったく使用しないでください。)

于 2012-08-23T14:28:31.140 に答える
2

あなたが行くことができる唯一の簡単な方法は

RAWR = "hi"
def test(newone):
    if newone:
        lR = "hello"   # make RAWR a new variable, don't reference global in this function
    else:
        global RAWR
        lR = RAWR      # reference global variable in this function
    print lR           # if bool, use local, else use global (and modify global)
    # modify lR and then
    if not newone:
        RAWR = lR

ただし、別の方法として、クラスとオブジェクトの概念を目的に合わせて悪用することもできます。

class store_RAWR(object):
    RAWR = "hi"
    def __init__(self, new): self.RAWR = new

def test(newone):
    if newone:
        myR = store_RAWR("hello") # get a (temporary) object with a different string
    else:
        myR = store_RAWR # set the class, which is global.
    # now modify myR.RAWR as you need

ただし、これには、グローバル名を使用する他のプログラム部分も変更する必要があります。

于 2012-08-23T14:39:38.230 に答える