在python中更改全局变量值的问题

时间:2013-08-24 15:19:48

标签: python

假设我有这个功能

>>>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])。

4 个答案:

答案 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个点,并且您修改了变量引用的对象,而不是引用变量本身。