3

假设我有这个功能

>>>a=3
>>>def num(a):
       a=5
       return a
>>>num(a)
5
>>>a
3

a 的值不变。

现在考虑这段代码:

>>> index = [1]
>>> def change(a):
       a.append(2)
       return a
>>> change(index)
>>> index
>>> [1,2] 

在此代码中,索引的值发生了变化。有人可以解释一下这两个代码中发生了什么。根据第一个代码,index 的值不应该改变(即应该保持 index=[1])。

4

4 回答 4

7

您需要了解 python 名称的工作原理。这里有一个很好的解释,你可以点击这里查看你的案例的动画。

如果您确实想在函数中对单独的列表进行操作,则需要创建一个新列表,例如使用

a = a[:]

在其他任何事情之前。请注意,这只会创建一个新列表,但元素仍然是相同的。

于 2013-08-24T15:58:45.293 回答
1

的值index 不变index仍然指向与之前相同的对象。但是,对象index指向的状态已经改变。这就是可变状态的工作原理。

于 2013-08-24T15:28:25.497 回答
1

第一个代码块中的第 3 行是assignment,第二个代码块是mutation,这就是您观察该行为的原因。

于 2013-08-24T15:41:08.440 回答
0

您遇到的问题是:

a = 3
def num(a):
    # `a` is a reference to the argument passed, here 3.
    a = 5
    # Changed the reference to point at 5, and return the reference.
    return a

num(a)

a函数中的是num一个不同于a全局定义的对象。它适用于列表,因为列表中的a点已传递,并且您修改了变量引用的对象,而不是引用变量本身。

于 2013-08-24T15:34:44.210 回答