image.png
变量间的复制操作和拷贝操作的区别主要体现在对对象的复制和拷贝上。
创建对象时,应该是先创建对象,然后将对象的地址返回给被赋值的变量。这也导致两个变量之间的赋值操作只是存储地址的复制,因此两个变量可以视为完全一样的变量。

而对于copy命令来说,无论是浅拷贝copy还是深拷贝deepcopy,对对象的copy都会创建一个新的存储地址,因此拷贝对象的存储地址会发生改变。
deepcopy和copy的主要区别在于是否会对拷贝对象的子对象进行拷贝,浅拷贝不拷贝子对象,即子对象的存储地址是和源对象保持一致的。而深度拷贝则会通过递归拷贝将子对象一并拷贝,因此二者的子对象指向的位置是不一样的。
拷贝和复制的操作是无法通过直接观察拷贝结果来判断的,因为不管是哪种操作都会把值复制一遍,区别是是否会为这个 值创建新的地址。

from copy import copy, deepcopy


class Age():
pass
class Name():
pass
class Student():
def __init__(self,name,age) -> None:
self.age=age
self.name=name
age=Age()
name=Name()
stu=Student(name,age)
print("复制变量的时候两个变量指向同一个位置")
a=stu
print(id(stu),id(a))
print(id(stu.name),id(a.name))
print(id(stu.age),id(stu.age))
print("浅拷贝时子对象不拷贝")
b=copy(stu)
print(id(stu),id(stu.age),id(stu.name))
print(id(b),id(b.age),id(b.name))
print("深拷贝,子对象也拷贝")
b=deepcopy(stu)
print(id(stu),id(stu.age),id(stu.name))
print(id(b),id(b.age),id(b.name))



image.png