程序:
import copy class ListNode(): def __init__(self,value=None): self.val=value self.next=None a=ListNode(3) e=ListNode(33) f=ListNode(333) a.next=e b=a # 用=做赋值可以看做b是a的别名 c=copy.deepcopy(a) d=copy.copy(a) a.val=4 a.next=f print(b.val,b.next.val) print(c.val,c.next.val) print(d.val,d.next.val) b.val=666 print(a.val) a1=[1,2,[3]] print(a1) b1=a1 # 用=做赋值可以看做b是a的别名 c1=copy.copy(a1) d1=copy.deepcopy(a1) a1[0]=666 a1[1]=[2,2]#替换 a1.append(4)#增加 a1[2].append(3)# print(a1,b1,c1,d1) a2=2 b2=3 c2=a2 a2=b2 b2=c2 print(a2,b2,c2) a3=2 b3=a3 c3=copy.copy(a3) d3=copy.deepcopy(a3) a3=3 print(a3,b3,c3,d3)
运行结果:
4 333
3 33
3 33
666
[1, 2, [3]]
[666, [2, 2], [3, 3], 4] [666, [2, 2], [3, 3], 4] [1, 2, [3, 3]] [1, 2, [3]]
3 2 2
3 2 2 2
结论:
对链表节点来说:
=:别名,和赋值对象一模一样
copy、deepcopy:没变化
对数组来说:
=:别名
copy:复制了数组元素个数,不能增加元素了,也不能简单粗暴改了,但对数组中的数组可以append
deepcopy:纹丝不动
对简单的常变量来说:
三种方法都不会导致别名现象