我对python中一个相当简单的任务有疑问,但是,我没有找到解决方案。我想为python中已经存在的变量分配一个新值。但是,我对函数中的变量所做的更改不会保留在变量中。
这是我的问题的简化示例:
y = 1
x = None
def test(var):
var = y
return var
test(x)
print(x)
打印仅返回任何内容。因此,我对函数中的变量所做的更改是永久性的。
如何使对输入变量的更改永久生效?
谢谢!
答案 0 :(得分:0)
这是按值将变量传递给函数的示例。默认情况下,当您将变量传递给Python中的函数时,它会按值传递。
这意味着,将使用具有相同值x
的新作用域创建新变量。因此,新x
发生的任何更改都不会反映到函数范围之外的x
。
如果要从函数中获取值,可以使用return语句(如前所述)。 return
从函数返回值。但是,在您的示例中,没有变量可以接收它。因此,它丢失了。
您必须将函数调用为x = test(x)
。这样可以确保x
从函数接收回来的值。
答案 1 :(得分:0)
Python中的变量只是引用指向对象的名称。在表达式中,名称是实际对象的替代。说test(x)
的意思是“将x
引用的对象传递到test
中”。这并不意味着“将符号x
传递到test
”。
此外,重新分配名称只会更改该名称 所指的对象。它既不影响对象也不影响其别名。
简而言之,您在var
内修改的名称test
与x
毫无关系。
让函数更改某些内容的首选方法是重新分配结果:
x = 2
def change(var):
return var * 2
x = change(x) # x now refers to 4 instead of 2
print(x)
如果要在函数外部更改名称,可以使用nonlocal
和global
关键字:
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)