无法理解python函数中的不可变,可变,范围

时间:2015-05-20 21:24:30

标签: python scope immutability mutable

在python 3.4中查看我的代码。我可以解决它。它让我有点烦恼。我猜这与foo2重置a而不是将其作为列表1处理有关。

def foo1(a):
    a.append(3) ### add element 3 to end of list
    return()

def foo2(a):
    a=a+[3] #### add element 3 to end of list
    return()

list1=[1,2]
foo1(list1)
print(list1) ### shows [1,2,3]

list1=[1,2]
foo2(list1)
print(list1) #### shows [1,2]

3 个答案:

答案 0 :(得分:1)

foo2中,您不会改变a引用的原始列表 - 而是从list1[3]创建新列表,并绑定结果,这是一个新列表到本地名称a。所以list1根本没有改变。

答案 1 :(得分:1)

追加与+ =

之间存在差异
>>> a = []
>>> id(a)
11814312
>>> a.append("hello")
>>> id(a)
11814312

>>> b = []
>>> id(b)
11828720
>>> c = b + ["hello"]
>>> id(c)
11833752
>>> b += ["hello"]
>>> id(b)
11828720

如您所见,追加和+ =具有相同的结果;他们将项目添加到列表中,而不生成新列表。使用+添加两个列表并生成一个新列表。

答案 2 :(得分:0)

在第一个示例中,您使用的是一种可以就地修改a的方法。在第二个示例中,您创建了一个新的a来替换旧的a,但没有修改旧的a - 这通常是在您使用=时发生的情况分配一个新值。一个例外是当您在左侧使用切片表示法时:a[:] = a + [3]将像您的第一个示例一样工作。