python list中的‘=’、深拷贝和浅拷贝问题

时间:2022-06-01 20:53:48

python中list的赋值操作主要有三种,‘=’、拷贝(浅拷贝copy)和深拷贝(deepcopy),下面结合例子来说明这三种操作:

1)‘=’:

用等号来赋值,新的变量和原来的变量实际上指向的是同一个地址,等号连接起来的变量互相影响,看如下的操作:

testlist =list('abcdef')

Alice =testlist
Bob =testlist

Alice.append("oo")

print('testlist=',testlist)
print('Alice=',Alice)
print('Bob=',Bob)

输出:

testlist= ['a', 'b', 'c', 'd', 'e', 'f', 'oo']
Alice = ['a', 'b', 'c', 'd', 'e', 'f', 'oo']
Bob = ['a', 'b', 'c', 'd', 'e', 'f', 'oo']

可以看出,Alice用等号与testlist连接后,对Alice的改变会直接影响到原列表以及与之相连的Bob,也就是说Alice、Bob和testlist都指向同一地址,对任意一个的修改都会影响到其他两个变量

copy.copy(x)=x.copy()

注:import copy后使用的copy函数和python自带的copy函数作用是相同的(copy.copy(x)=x.copy())

2)浅拷贝copy:

拷贝原list变量的第一层,之后对新变量或者旧变量的第一层的修改不会影响到彼此,第二层以及更多层之间则是像第一中操作中一样,是互相影响的。什么是第一层呢,例如:

a =[1,2,[3,4]]

那么1,2,[3,4]都属于第一层的元素,在新变零中修改第一层的元素不会影响到原变量,同样,在原变量中修改第一层的元素也不会影响到新变量;而3,4属于第第二层中的元素,对他们修改会影响到用浅拷贝连接起来的所有变量中的第二层元素:
(1)修改新变量观察对原变量的影响:

import copy
testlist =[1,2,[3,4]]

Alice = copy.copy(testlist)
Bob = copy.copy(testlist)

testlist[0] =0
testlist[2][0]=9

print('testlist=',testlist)
print('Alice =',Alice)
print('Bob =',Bob)

输出

testlist= [0, 2, [9, 4]]
Alice = [1, 2, [9, 4]]
Bob = [1, 2, [9, 4]]

(2)修改新变量,看看对原变量的影响:

import copy
testlist =[1,2,[3,4]]

Alice = copy.copy(testlist)
Bob = copy.copy(testlist)

Alice[1]=0
Alice[2][0] =8

print('testlist=',testlist)
print('Alice =',Alice)
print('Bob =',Bob)

输出:

testlist= [1, 2, [8, 4]]
Alice = [1, 0, [8, 4]]
Bob = [1, 2, [8, 4]]

3)深拷贝deepcopy:

复制出来的与原来的变量没有任何关系,最清爽的复制


从list推广到其他类型的变量是不是也这样呢?后续再解决