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:
复制出来的与原来的变量没有任何关系,最清爽的复制