python可变和不可变的函数参数

时间:2017-09-28 14:48:19

标签: python

我偶然发现了python的一个奇怪的行为"(对我来说很奇怪)。我以为我创造了一个 列表" a"传递ParamList的第一个元素,这是一个列表。 然后我改变了#34; a"在另一个函数中,但ParamList [0]也被改变了。我没想到。

查看以下最小代码

def f(ParamList):
    b = ParamList[1]
    a = ParamList[0]
    print('id(ParamList[0]), id(a)', id(ParamList[0]), id(a))
    a, b = Problemmaker(a,b)
    print('a, b, ParamList', a, b, ParamList)

def Problemmaker(a,b):
    a[2]=99
    print('id(a)', id(a))
    b = 55
    return a,b

if __name__ == "__main__":
    Initial = [[2,3,4],2]

    f(Initial)

1 个答案:

答案 0 :(得分:0)

我已经发现了什么,问题是什么。

显然,我所做的就是那个 ""和ParamList [0]引用相同的地址。

所以我在想,#34; a"获取ParamList [0]的值,但事实上,我所做的只是 引用" a"到同一个地址。因此,当我改变" a"时,存储在该地址中的值也发生了变化,因此获得了ParamList [0]。

所以如果我不想改变" a"但不是ParamList [0],我可以为" a"创建一个新列表。并且避免了这个问题。

def f(ParamList):
    b = ParamList[1]
    a = [*ParamList[0]]
    print('id(ParamList[0]), id(a)', id(ParamList[0]), id(a))
    a, b = Problemmaker(a,b)
    print('a, b, ParamList', a, b, ParamList)

def Problemmaker(a,b):
    a[2]=99
    print('id(ParamList[0]), id(a)', id(a))

    b = 55
    return a,b

if __name__ == "__main__":
    Initial = [[2,3,4],2]

    f(Initial)

这是令人尴尬的,因为我在python中编码很长时间知道而且我是 一直以为我知道什么是什么,但是承认这个错误希望让我更加细致。