如何改变函数中变量的作用域?Python

How to change the scope of a variable in a function? Python

本问题已经有最佳答案,请猛点这里访问。

这似乎是一个非常愚蠢的问题,但我对Python中的作用域规则感到困惑。在下面的示例中,我将两个具有值的变量(x,y)发送到一个函数,该函数应该更改它们的值。当我打印结果时,变量没有改变。

1
2
3
4
5
6
7
8
9
10
def func1(x,y):
    x=200
    y=300

x=2
y=3

func1(x,y)

print x,y #prints 2,3

现在,如果这是C++,我将通过引用(ANP)将它们发送给该函数,从而能够改变它们的值。那么Python中的马是什么呢?更重要的是,当您将对象发送到函数时,实际会发生什么?python是否对这些对象进行了新的引用?


把它们当作功能的一部分。当函数结束时,它的所有变量也将消失。

1
2
3
4
5
6
7
8
9
10
x=2
y=3

def func(x,y):
    x=200
    y=300

func(x,y) #inside this function, x=200 and y=300
#but by this line the function is over and those new values are discarded
print(x,y) #so this is looking at the outer scope again

如果您希望函数按照您编写的方式修改值,那么可以使用global,但这是非常糟糕的做法。

1
2
3
4
5
6
7
8
def func(x,y):
    global x #these tell the function to look at the outer scope
    global y #and use those references to x and y, not the inner scope
    x=200
    y=300

func(x,y)
print(x,y) #prints 200 300

问题在于,在最好的情况下调试是一场噩梦,而在最坏的情况下调试是完全不可能的。像这样的事情在函数中通常被称为"副作用"——设置一个不需要设置的值,如果不显式返回它,那么这样做是一件坏事。通常,您应该编写的修改项目的唯一函数是对象方法(比如[].append()修改列表,因为返回一个新的列表是愚蠢的!)

这样做的正确方法是使用返回值。尝试一下

1
2
3
4
5
6
7
8
9
def func(x,y):
    x = x+200 #this can be written x += 200
    y = y+300 #as above: y += 300
    return (x,y) #returns a tuple (x,y)

x = 2
y = 3
func(x,y) # returns (202, 303)
print(x,y) #prints 2 3

为什么不起作用?好吧,因为你从来没有告诉程序对这个tuple(202, 303)做任何事情,只是为了计算它。我们现在分配吧

1
2
3
4
5
#func as defined above

x=2 ; y=3
x,y = func(x,y) #this unpacks the tuple (202,303) into two values and x and y
print(x,y) #prints 202 303