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 回答