我从使用Matlab转到了Python,使用函数时的变量赋值让我感到困惑
我有一个代码如下:
a = [1,1,1]
def keeps(x):
y = x[:]
y[1] = 2
return y
def changes(x):
y = x
y[1] = 2
return y
aout = keeps(a)
print(a, aout)
aout = changes(a)
print(a, aout)
第一个print语句给出[1, 1, 1] [1, 2, 1]
,而
第二个给出了[1, 2, 1] [1, 2, 1]
我的理解是(来自Matlab)函数中变量的操作是局部的。但是在这里,如果我不在函数内部复制变量,那么函数外部的值也会改变。这几乎就像变量被定义为global
如果有人能够解释变量在这两种方法中的分配方式是如何不同的,那么这将非常有帮助。如果有人希望向函数发送变量而不影响函数外部的值,那么最好的做法是什么?谢谢
让我们看一下您的代码,但首先,我们将把函数声明模式设置为顶部,以便执行顺序变得更清晰
基本上,如果您只是将另一个变量名分配给一个列表,那么您将为同一个对象指定两个名称,因此内容中的任何更改都可能影响两个“列表”。当您使用
y = x[:]
时,实际上是在内存中通过列表切片创建x
列表的新副本,并将新变量名y
分配给该列表的新副本参数传递是通过赋值完成的。在
changes
中,隐式发生的第一件事是x = a
当您调用changes(a)
时。由于分配从不复制数据您会变异a
在
keeps
中,您没有改变参数列表,因为x[:]
正在创建一个(浅层)副本,然后将名称y
分配给该副本我强烈推荐看Facts and Myths about Python names and values
相关问题 更多 >
编程相关推荐