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 |
如果您希望函数按照您编写的方式修改值,那么可以使用
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 |
问题在于,在最好的情况下调试是一场噩梦,而在最坏的情况下调试是完全不可能的。像这样的事情在函数中通常被称为"副作用"——设置一个不需要设置的值,如果不显式返回它,那么这样做是一件坏事。通常,您应该编写的修改项目的唯一函数是对象方法(比如
这样做的正确方法是使用返回值。尝试一下
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
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 |