返回

万丈高楼平地起!自研浅拷贝、深拷贝你也能做到!

前端

万丈高楼平地起!自研浅拷贝、深拷贝你也能做到!

浅拷贝和深拷贝是我们日常开发中经常会用到的功能,浅拷贝会创建一个新对象,该对象包含对原始对象中引用对象的引用,而深拷贝会创建一个新对象,该对象包含对原始对象中所有对象的副本。本文将讨论浅拷贝和深拷贝的概念,并提供一些在 Python 中实现浅拷贝和深拷贝的示例。

浅拷贝

浅拷贝是复制一个对象,但它只复制该对象的属性,而不复制该对象的子对象。这意味着如果该对象包含对另一个对象的引用,则浅拷贝将复制该引用,而不是复制被引用的对象本身。

在 Python 中,浅拷贝可以通过使用 copy.copy() 函数来实现。例如,以下代码演示了如何使用 copy.copy() 函数来创建对象的浅拷贝:

import copy

obj1 = {
    "name": "John",
    "age": 30,
    "address": {
        "street": "123 Main Street",
        "city": "Anytown",
        "state": "CA",
        "zip": "12345"
    }
}

obj2 = copy.copy(obj1)

obj2["name"] = "Jane"

print(obj1)
print(obj2)

输出:

{'name': 'John', 'age': 30, 'address': {'street': '123 Main Street', 'city': 'Anytown', 'state': 'CA', 'zip': '12345'}}
{'name': 'Jane', 'age': 30, 'address': {'street': '123 Main Street', 'city': 'Anytown', 'state': 'CA', 'zip': '12345'}}

如你所见,obj2 是 obj1 的浅拷贝。obj2 的属性与 obj1 的属性相同,但 obj2 的 address 属性仍然指向相同的对象。这意味着对 obj2 的 address 属性所做的任何更改都会反映在 obj1 的 address 属性上。

深拷贝

深拷贝是复制一个对象,不仅复制该对象的属性,还复制该对象的子对象。这意味着如果该对象包含对另一个对象的引用,则深拷贝将复制该引用及其引用的对象。

在 Python 中,深拷贝可以通过使用 copy.deepcopy() 函数来实现。例如,以下代码演示了如何使用 copy.deepcopy() 函数来创建对象的深拷贝:

import copy

obj1 = {
    "name": "John",
    "age": 30,
    "address": {
        "street": "123 Main Street",
        "city": "Anytown",
        "state": "CA",
        "zip": "12345"
    }
}

obj2 = copy.deepcopy(obj1)

obj2["name"] = "Jane"

print(obj1)
print(obj2)

输出:

{'name': 'John', 'age': 30, 'address': {'street': '123 Main Street', 'city': 'Anytown', 'state': 'CA', 'zip': '12345'}}
{'name': 'Jane', 'age': 30, 'address': {'street': '123 Main Street', 'city': 'Anytown', 'state': 'CA', 'zip': '12345'}}

如你所见,obj2 是 obj1 的深拷贝。obj2 的属性与 obj1 的属性相同,但 obj2 的 address 属性指向一个新的对象。这意味着对 obj2 的 address 属性所做的任何更改都不会反映在 obj1 的 address 属性上。

结论

浅拷贝和深拷贝是 Python 中非常有用的工具。浅拷贝可用于创建对象的副本,而深拷贝可用于创建对象的副本及其所有子对象的副本。在本文中,我们讨论了浅拷贝和深拷贝的概念,并提供了一些在 Python 中实现浅拷贝和深拷贝的示例。