首页 > 解决方案 > 函数内部变量的赋值改变了外部的赋值 - 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.

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

标签: pythonfunctionvariablesscope

解决方案


参数传递是通过赋值完成的。在changes中,隐含发生的第一件事是
x = a当您调用时changes(a)。由于assingment 永远不会复制您 mutate的数据a

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

我强烈建议您观看有关 Python 名称和值的 Facts and Myths


推荐阅读