返回
深浅拷贝与extend实现,代码从没如此清晰过!
前端
2023-09-02 16:44:07
理解浅拷贝和深拷贝
浅拷贝是指只拷贝对象的一层属性,如果拷贝的属性还是对象,那么修改它则会影响到拥有相同属性的对象。
深拷贝是指不仅拷贝对象本身的属性,还会递归地拷贝所有层级属性的对象。这样,修改拷贝后的对象不会影响到原始对象。
代码实现
# 浅拷贝
def shallow_copy(obj):
return obj.__class__(obj.__dict__)
# 深拷贝
def deep_copy(obj):
new_obj = obj.__class__()
for key, value in obj.__dict__.items():
if isinstance(value, (list, tuple, dict)):
new_value = deep_copy(value)
else:
new_value = value
new_obj.__dict__[key] = new_value
return new_obj
# extend函数
def extend(obj, other):
for key, value in other.__dict__.items():
obj.__dict__[key] = value
实例分析
# 创建一个列表对象
list1 = [1, 2, [3, 4]]
# 浅拷贝列表对象
list2 = shallow_copy(list1)
# 修改浅拷贝后的列表对象
list2[2][0] = 5
# 打印原始列表对象和浅拷贝后的列表对象
print(list1) # [1, 2, [5, 4]]
print(list2) # [1, 2, [5, 4]]
# 创建一个列表对象
list1 = [1, 2, [3, 4]]
# 深拷贝列表对象
list2 = deep_copy(list1)
# 修改深拷贝后的列表对象
list2[2][0] = 5
# 打印原始列表对象和深拷贝后的列表对象
print(list1) # [1, 2, [3, 4]]
print(list2) # [1, 2, [5, 4]]
# 创建一个字典对象
dict1 = {'name': 'John', 'age': 25, 'address': {'city': 'New York', 'state': 'NY'}}
# 浅拷贝字典对象
dict2 = shallow_copy(dict1)
# 修改浅拷贝后的字典对象
dict2['address']['city'] = 'Los Angeles'
# 打印原始字典对象和浅拷贝后的字典对象
print(dict1) # {'name': 'John', 'age': 25, 'address': {'city': 'Los Angeles', 'state': 'NY'}}
print(dict2) # {'name': 'John', 'age': 25, 'address': {'city': 'Los Angeles', 'state': 'NY'}}
# 创建一个字典对象
dict1 = {'name': 'John', 'age': 25, 'address': {'city': 'New York', 'state': 'NY'}}
# 深拷贝字典对象
dict2 = deep_copy(dict1)
# 修改深拷贝后的字典对象
dict2['address']['city'] = 'Los Angeles'
# 打印原始字典对象和深拷贝后的字典对象
print(dict1) # {'name': 'John', 'age': 25, 'address': {'city': 'New York', 'state': 'NY'}}
print(dict2) # {'name': 'John', 'age': 25, 'address': {'city': 'Los Angeles', 'state': 'NY'}}
extend函数的使用
# 创建一个列表对象
list1 = [1, 2, 3]
# 创建另一个列表对象
list2 = [4, 5, 6]
# 使用extend函数合并两个列表对象
list1.extend(list2)
# 打印合并后的列表对象
print(list1) # [1, 2, 3, 4, 5, 6]
# 创建一个字典对象
dict1 = {'name': 'John', 'age': 25}
# 创建另一个字典对象
dict2 = {'address': {'city': 'New York', 'state': 'NY'}}
# 使用extend函数合并两个字典对象
dict1.update(dict2)
# 打印合并后的字典对象
print(dict1) # {'name': 'John', 'age': 25, 'address': {'city': 'New York', 'state': 'NY'}}