函数内部的变量分配更改外部的分配-Python

时间:2018-10-03 14:28:06

标签: python function variables scope

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

第一个打印语句给出[1, 1, 1] [1, 2, 1],而

第二个给出[1, 2, 1] [1, 2, 1]

我了解(来自Matlab)对函数内变量的操作是局部的。但是在这里,如果我不复制函数内部的变量,则值也将在函数外部更改。就像变量定义为global一样。

如果有人可以解释如何在两种方法中对变量进行不同的分配,以及如果希望将变量发送给函数而不影响函数外部的值,则最佳实践是什么,这将非常有帮助?谢谢。

2 个答案:

答案 0 :(得分:2)

参数传递是通过赋值完成的。在print(sum([i['Rank'] for i in student_data])/len(student_data)) # => 48.2 中,隐式发生的第一件事是
 致电changesx = a。由于断言永远不会复制数据,因此您会突变changes(a)

a中,您不会更改参数列表,因为keeps正在创建一个(浅)副本,然后将其命名为x[:]

我强烈建议您观看Facts and Myths about Python names and values

答案 1 :(得分:1)

让我们看一下您的代码,但是首先,我们将函数声明置于顶部,以便执行的顺序更加清晰。

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分配给列表的该新副本。