Python:保留对在函数内进行的变量的更改

时间:2018-11-11 14:46:01

标签: python function variables

我对python中一个相当简单的任务有疑问,但是,我没有找到解决方案。我想为python中已经存在的变量分配一个新值。但是,我对函数中的变量所做的更改不会保留在变量中。

这是我的问题的简化示例:

y = 1
x = None

def test(var):

    var = y

    return var 


test(x)
print(x)

打印仅返回任何内容。因此,我对函数中的变量所做的更改是永久性的。

如何使对输入变量的更改永久生效?

谢谢!

2 个答案:

答案 0 :(得分:0)

这是按值将变量传递给函数的示例。默认情况下,当您将变量传递给Python中的函数时,它会按值传递。

这意味着,将使用具有相同值x的新作用域创建新变量。因此,新x发生的任何更改都不会反映到函数范围之外的x

如果要从函数中获取值,可以使用return语句(如前所述)。 return从函数返回值。但是,在您的示例中,没有变量可以接收它。因此,它丢失了。

您必须将函数调用为x = test(x)。这样可以确保x从函数接收回来的值。

答案 1 :(得分:0)

Python中的变量只是引用指向对象的名称。在表达式中,名称是实际对象的替代。说test(x)的意思是“将x引用的对象传递到test中”。这并不意味着“将符号x传递到test”。

此外,重新分配名称只会更改该名称​​ 所指的对象。它既不影响对象也不影响其别名。

简而言之,您在var内修改的名称testx毫无关系。


让函数更改某些内容的首选方法是重新分配结果:

x = 2
def change(var):
    return var * 2

x = change(x)  # x now refers to 4 instead of 2
print(x)

如果要在函数外部更改名称,可以使用nonlocalglobal关键字:

x = 2
def change_x():
    global x
    x = x * 2

change_x()  # x now refers to 4 instead of 2
print(x)

尽管这可以使一些琐碎的问题易于解决,但对于大型程序而言,通常是个坏主意。使用全局变量意味着不能再单独使用该函数了。结果可能取决于调用此函数的频率和顺序。


如果您有一些自成体系的值并可以修改它们,可以使用类来描述:

class XY:
    def __init__(self, x, y):
        self.x, self.y = x, y

    def swap(self):
        self.x, self.y = self.y, self.x

my_values = XY(None, 1)
print(my_values.x, my_values.y)
my_values.swap()
print(my_values.x, my_values.y)

global变量相反,您可以根据需要创建尽可能多的隔离类实例。每个实例都可以独立处理,而不会影响其他实例。


您还可以更改值以使更改对外部可见。您无需更改名称,而是修改值。

x = [2]  # x is a mutable list, containing the value 2 at the moment
def change(var):
    var[0] = 4

change(x)  # x now contains 4 instead of 2
print(x)