假设我有这个功能
>>>a=3
>>>def num(a):
a=5
return a
>>>num(a)
5
>>>a
3
不变的价值。
现在考虑以下代码:
>>> index = [1]
>>> def change(a):
a.append(2)
return a
>>> change(index)
>>> index
>>> [1,2]
在此代码中,索引的值会发生变化。 有人可以解释这两个代码中发生的事情。根据第一个代码,索引的值不应该改变(即应该保持索引= [1])。
答案 0 :(得分:7)
您需要了解python名称的工作原理。有一个很好的解释here,您可以click here获取您案例的动画。
如果您确实想要在函数中的单独列表中操作,则需要创建一个新列表,例如使用
a = a[:]
之前的事情。请注意,这只会生成一个新列表,但元素仍然是相同的。
答案 1 :(得分:1)
index
的值不会更改。 index
仍然指向它之前所做的相同对象。但是,对象index
的状态指向已更改。这就是可变状态的运作方式。
答案 2 :(得分:1)
第一个代码块中的第3行是赋值,第二个块中的第3行是 mutation ,这就是您观察该行为的原因。
答案 3 :(得分: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
个点,并且您修改了变量引用的对象,而不是引用变量本身。