这里面有巨大的危机!
在python2中,令一个新对象直接等于一个列表,如
a = [1, 3, 5]
b = a
时,解释器仅会创建一个浅拷贝,也就是说,b和a指向同一块内存空间,无论你修改a还是修改b,都会直接影响那块内存,也就是说
b.append(7)
print a
>>> [1, 3, 5, 7]
好了,这种情况不仅存在于赋值给新对象的时候,还存在于列表作为形参传入函数的时候,也就是:
a = [1, 3, 5]
def test(li=[]):
li.append(7)
test(a)
print a
>>> [1, 3, 5, 7]
看到了吗,当列表作为形参传入函数时,函数中操作的仍然是同一块内存空间!
很多人可能写了好几年的python都不知道这个细节,比如我。
这么做可能会带来许多隐藏的bug,尤其当整个程序较为庞大时,列表的浅拷贝特性可能带来非常大的危机!
怎么办呢?当然是转化成深拷贝:
a = [1, 3, 5]
b = a[:]
print a
>>> [1, 3, 5]
对,就是用用切片的方法选取整个列表就可以了,这样解释器会创建一块新的内存空间存放b这个对象,从此a和b就没有瓜葛了。
这个细节挺重要的,希望能帮助到大家,不然这么小个细节我也懒得写。