首页 > 解决方案 > 为什么python在定义函数时会这样处理列表?

问题描述

我正在编写代码,变量开始表现得很奇怪,并被分配给我认为它们不应该分配的东西。因此,我决定将情况降低到最小的复杂性以解决我的疑问,这就是发生的事情:

以下代码:

a = [2]

def changeA(c):
    d = c
    d[0] = 10
    return True

changeA(a)

print(a)

打印“[10]”。这对我来说没有意义,因为在第一次分配之后我从未将列表“a”分配为任何内容。在函数 changeA 内部,局部变量 d 被分配为函数的输入,在我看来,这种分配是双向发生的,甚至改变了“外部”。如果是这样,为什么?如果不是,为什么会这样?

我还注意到代码

a = [2]

def changeA(c):
    d = list(c)
    d[0] = 10
    return True

changeA(a)

print(a)

表现正常(即,如我所料)。

编辑:这个问题被认为是这个问题的重复。我不认为这是真的,因为这里也涉及到函数内部过程的局部性特征被违反了。

标签: pythonpython-3.xlistvariables

解决方案


Python 变量是对对象的引用,有些对象是可变的。数字不是,字符串和元组也不是,但列表、集合和字典是。

让我们看看下面的 Python 代码

a = [2]       # ok a is a reference to a mutable list
b = a         # b is a reference to the exact same list
b[0] = 12     # changes the value of first element of the unique list
print(a)      # will display [12]

推荐阅读