首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:从函数参数修改全局var

Python:从函数参数修改全局var
EN

Stack Overflow用户
提问于 2013-12-30 06:19:14
回答 3查看 2.1K关注 0票数 1

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

为什么会发生这种情况,而实现这一目标的最有效/优雅/毕达内方式是什么呢?

给予:

代码语言:javascript
复制
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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-30 06:32:51

您可以使用globals()访问变量,并从myFunc()内部分配新值。

代码语言:javascript
复制
var1 = 1
var2 = 2

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

print(var1, var2)

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

print(var1, var2)

将产出:

代码语言:javascript
复制
1, 2
10, 10
票数 3
EN

Stack Overflow用户

发布于 2013-12-30 07:09:59

在python中,变量是对象的名称。当您调用一个函数并传递它一个参数时,您是传递与变量关联的对象,而不是名称。例如,当您调用wash(mydog)时,您说的是“清洗称为我的狗的对象”。请记住,同一个对象可能有多个名称,例如spot = mydog = best_dog_ever = new_dog()。函数不知道使用哪个名称传递对象,即使它传递了对象,如果使用的名称不是全局范围中的名称,那么必须有某种方法来说明这个函数只使用全局变量作为参数。

我希望这有助于解释为什么会出现语法错误,但至少可以通过两种方式完成几乎相同的任务。第一种方法是简单地将返回值赋值给要更改的变量,例如:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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

甚至更好:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2022-08-09 05:29:57

为什么会发生这种情况?

因为要使用的全局变量与参数arg具有相同的名称。在Python中,参数是局部变量,变量只能是局部变量或全局变量,不能两者兼而有之。

似乎您希望能够使用var的内容来指定要修改的现有全局变量。它不是那样工作的。首先,变量不包含其他变量;它们包含。变量的名称不是值。同样,参数是局部变量--调用分配给的函数--这些变量。它分配一个。(请记住,您可以很容易地调用函数,而不需要为参数设置变量:myFunc(3)。这是否应该使3变得等于10呢?)

其次,即使您传递了一个字符串,您也必须做更多的工作才能访问相应的全局变量。它是可以做,但请不要使用

实现这一目标的最有效、最优雅/最有效的方法是什么?

Pythonic的方法是不要。如果您希望在调用函数时将信息传递出去,将返回一个值

代码语言:javascript
复制
def myFunc():
    return 10

var1 = myFunc()
var2 = myFunc()
var3 = myFunc()

修复错误的最简单方法是重命名全局变量。但是,这并不能解决代码的明显意图:

代码语言:javascript
复制
var1 = 1
var2 = 2
var3 = 3

def myFunc(arg):
    global g
    g = 10

# var1, var2 and var3 will NOT CHANGE
# Instead, the new global variable g is created, and assigned a value of 10,
# three times in a row.
myFunc(var1)
myFunc(var2)
myFunc(var3)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20834370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档