Python:从函数参数修改全局变量

时间:2013-12-30 06:19:15

标签: python arguments global-variables

我想创建一个函数,它将根据传递给它的参数修改初始化的全局变量,但我得到一个SyntaxError: name 'arg' is local and global。我已经看到了其他方法来实现这一点,使用globals()或在myFunc内创建一个简单的函数来“欺骗”Python。另一种方法是在myFunc内创建if语句以显式分配相应的全局变量,但这似乎过于冗长。

为什么会出现这种情况,以及最有效/优雅/ Pythonic的方法是什么?

假设:

var1 = 1
var2 = 2
var3 = 3

def myFunc(arg):
    global arg
    arg = 10

myFunc(var1) # each of these should print to 10
myFunc(var2)
myFunc(var3)

2 个答案:

答案 0 :(得分:1)

您可以使用globals()访问变量并从myFunc()

中分配新值
var1 = 1
var2 = 2

def myFunc(varname):
    globals()[varname] = 10

print(var1, var2)

myFunc("var1")
myFunc("var2")

print(var1, var2)

将输出:

1, 2
10, 10

答案 1 :(得分:0)

在python中,变量是对象的名称。当你调用一个函数,并传递一个参数你是passing the object associated with the variable,而不是名字。因此,例如当你打电话给wash(mydog)时,你会说“洗掉称为mydog的物体”。请记住,同一个对象可以有多个名称,例如spot = mydog = best_dog_ever = new_dog()。该函数不知道使用哪个名称来传递对象,即使它确实如此,如果使用的名称不是全局范围中的名称,那么你必须有一些方法说这个函数只需要全局变量作为参数。

我希望这有助于解释为什么你会遇到语法错误,但你仍然可以通过至少两种方式完成相同的事情。第一种是简单地将返回值分配给您尝试更改的变量,例如:

var1 = 1
var2 = 2

def addone(a):
    return a + 1

def main():
    global var1, var2
    var1 = addone(var1)
    var2 = addone(var2)

print var1, var2
main()
print var1, var2

第二种是使用更面向对象的方法,如下所示:

class GlobalValue(object):

    def __init__(self, value):
        self.value = value

var1 = GlobalValue(1)
var2 = GlobalValue(2)

def addone(a):
    a.value += 1

print var1.value, var2.value
addone(var1)
addone(var2)
print var1.value, var2.value

甚至更好:

class GlobalValue(object):

    def __init__(self, value):
        self.value = value

    def addone(self):
        self.value += 1

var1 = GlobalValue(1)
var2 = GlobalValue(2)

print var1.value, var2.value
var1.addone()
var2.addone()
print var1.value, var2.value