import copy
adata_list = [1,2,3,4,[5,6]]
d1 = adata_list #这是地址引用
d2 = copy.copy(adata_list) #浅拷贝
d3 = copy.deepcopy(adata_list) #深拷贝
d4 = adata_list[:] #数组拷贝
(d5) = (adata_list) #元组拷贝
adata_list.append('a')
adata_list[4].append('b')
d3.append('d3')
d4.append('d4')
d5.append('d5')
print adata_list #[1,2,3,4,[5,6,'b'],'a','d5']
print d1 #[1,2,3,4,[5,6,'b'],'a','d5']
print d2 #[1,2,3,4,[5,6,'b']]
print d3 #[1,2,3,4,[5,6],'d3']
print d4 #[1,2,3,4,[5,6,'b'],'d4']
print d5 #[1,2,3,4,[5,6,'b'],'a','d5']
def foo(data):
相当于 def foo(new_var = data):
(不是说函数参数格式是这样的,而是说输入的data赋值给一个新的变量new_var),
所以和上面描述的数组拷贝方式是一样的。
浅拷贝会将数组中的元素拷贝过来,如果元素是不可更改数据(比如int,float,string,tuple),则拷贝一个新的副本,如果是可更改数据(list,map)则进行地址拷贝。data_list[:]就是浅拷贝,用slice切片进行的操作应该都是浅拷贝,具体你可以试一试。
所以如果你想让自己传递进去的数据不被更改,那么有如下方案可以实现:
data_list改用data_tuple或者foo(tuple(data_list)),但是输入的是tuple,不能直接操作,如果需要操作赋值,还需要转换成list。
利用copy.deepcopy(data_list)进行深拷贝
如果能保证是一维数组,则可以利用copy.copy(data_list)或者data_list[:]进行浅拷贝。
回答完毕~ 啦啦啦~