比较两个对象的值是否相等,调用对象的__eq__()方法比较两个对象的是否是同一个对象,比较的是对象id的内存地址a=[1,2,3]b=ac=[1,2,3]print(f"a==b {a==b}") # Trueprint(f"a is b {a is b}") # Trueprint(f"a == c {a == c}") # Trueprint(f"a is c {a is c}") # False
浅拷贝创建一个新对象,但只复制原对象第一层的内容,对于嵌套对象,只复制引用而不创建新对象.使用函数copy.copy()实现original_list=[1,2,[3,4]]shallow_copied = copy.copy(original_list)#修改第一层元素,第一层复制了一个新对象,所以不受影响shallow_copied[0]=100print(original_list) # [1, 2, [3, 4]] 不受影响print(shallow_copied) # [100, 2, [3, 4]]#修改第二层,因为是引用对象,修改会影响shallow_copied[2][0]=300print(original_list) # [1, 2, [300, 4]]print(shallow_copied) #[100, 2, [300, 4]]
深拷贝创建一个全新的对象,并递归复制所有嵌套对象,完全独立于原对象,修改不会互相影响.使用函数copy.deepcopy()实现original_list=[1,2,[3,4]]deep_copied = copy.deepcopy(original_list)#修改第一层,因为是一完全对立的对象,修改不受影响deep_copied[0]=100print(original_list) # [1, 2, [3, 4]] 不受影响print(deep_copied) # [100, 2, [3, 4]]#修改第二层,因为是一完全对立的对象,修改不受影响deep_copied[2][0]=300print(original_list) # [1, 2, [3, 4]]print(deep_copied) #[100, 2, [300, 4]]
不可变类型(int,float,string,tunple) 因为不可变对象不能被修改,所以无需创建新对象a = "hello"b = copy.copy(a)c = copy.deepcopy(a)print(a is b is c) # True - 都指向同一个字符串对象
可变类型(list,dict,set)浅拷贝只复制第一层,深拷贝会复制所有对于不可变对象(int,float,string,tunple)的操作是值传递,就是创建一个新对象def modify_num(x): print(f"函数内修改前x:{x},id={id(x)}") x+=10 print(f"函数内修改后x:{x},id={id(x)}")num = 5print(f"调用前x:{num},id={id(num)}")modify_num(num)print(f"调用后x:{num},id={id(num)}")"""调用前x:5,id=4390770976函数内修改前x:5,id=4390770976函数内修改后x:15,id=4390771296 创建了一个新对象调用后x:5,id=4390770976"""
对于可变对象(list,dict,set)的操作就是引用传递,对同一对象的修改def modify_list(lst): print(f"函数内修改前lst:{lst},id={id(lst)}") lst.append(4) print(f"函数内修改后lst:{lst},id={id(lst)}")my_list = [1, 2, 3]print(f"调用前: my_list = {my_list}, id = {id(my_list)}")modify_list(my_list)print(f"调用后: my_list = {my_list}, id = {id(my_list)}")"""调用前: my_list = [1, 2, 3], id = 4345237632函数内修改前lst:[1, 2, 3],id=4345237632函数内修改后lst:[1, 2, 3, 4],id=4345237632调用后: my_list = [1, 2, 3, 4], id = 4345237632"""