函数内的变量赋值会影响函数外的赋值 - Python

2024-06-03 00:25:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我从使用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。在

如果有人能解释变量在这两种方法中的分配方式是如何不同的,以及如果要将变量发送到函数而不影响函数外部的值,那么最佳实践是什么?谢谢。在


Tags: 方法函数代码return定义def局部语句
2条回答

让我们看看您的代码,但是首先,我们将把函数声明模式化到顶部,这样执行顺序就更清楚了。在

def keeps(x):
    y = x[:]  #Here you are creating a modifiable copy of the original x list and referencing it with y
    y[1] = 2
    return y

def changes(x):
    y = x  # Here you are just referencing x itself with a new name y
    y[1] = 2
    return y

a = [1,1,1]

aout = keeps(a)
print(a, aout)

aout = changes(a)
print(a, aout)

基本上,如果你只是给一个列表分配另一个变量名,你就给了同一个对象两个名字,所以内容的任何变化都可能影响到这两个“列表”。当您使用y = x[:]时,实际上是通过列表切片在内存中创建x列表的一个新副本,并将新变量名y分配给该列表的新副本。在

参数传递是通过赋值完成的。在changes中,隐式发生的第一件事是
x = a当您调用changes(a)时。因为赋值从不复制数据你会变异a。在

keeps中,您没有改变参数列表,因为x[:]正在创建一个(浅)副本,然后将名称y分配给该副本。在

我强烈推荐观看Facts and Myths about Python names and values。在

相关问题 更多 >