返回

深浅拷贝与extend实现,代码从没如此清晰过!

前端

理解浅拷贝和深拷贝

浅拷贝是指只拷贝对象的一层属性,如果拷贝的属性还是对象,那么修改它则会影响到拥有相同属性的对象。

深拷贝是指不仅拷贝对象本身的属性,还会递归地拷贝所有层级属性的对象。这样,修改拷贝后的对象不会影响到原始对象。

代码实现

# 浅拷贝
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'}}