1. 浅拷贝
在python中,我们经常需要拷贝对象,以便在程序中对它进行操作,而不改变原始对象的值。python提供了多种方法来实现对象的拷贝,其中一种常用的方法是浅拷贝。
浅拷贝是指创建一个新的对象,新对象的内容是原始对象的引用。这意味着所有的引用都指向了原始对象中的同一内存地址。换句话说,浅拷贝仅仅复制了对象的引用,而不是对象本身的值。
在python中,我们可以使用copy模块的copy()函数来进行浅拷贝。例如:
```python
import copy
list1 = [1, 2, 3]
list2 = copy.copy(list1)
print(list1) # [1, 2, 3]
print(list2) # [1, 2, 3]
print(list1 is list2) # false
```
在上面的例子中,我们使用copy()函数对list1进行了浅拷贝。list1和list2虽然内容相同,但它们指向不同的内存地址,所以list1 is list2的结果为false。
2. 深拷贝
有时候,在进行对象拷贝的时候,我们希望同时拷贝对象内部所有的子对象。这时,就需要使用深拷贝。
深拷贝是指创建一个新的对象,新对象的内容是原始对象及其子对象的拷贝。这意味着深拷贝会递归地复制对象和它的所有子对象,而不仅仅是对象的引用。
在python中,我们同样可以使用copy模块,但需要调用deepcopy()函数来进行深拷贝。例如:
```python
import copy
list1 = [1, 2, [3, 4]]
list2 = copy.deepcopy(list1)
list1[2][0] = 0
print(list1) # [1, 2, [0, 4]]
print(list2) # [1, 2, [3, 4]]
print(list1 is list2) # false
```
在上面的例子中,我们对list1进行了深拷贝,并修改了其中的子对象。结果显示,修改只影响了list1,而list2保持不变,这证明了list1和list2是完全独立的对象。
3. 自定义拷贝
除了浅拷贝和深拷贝之外,python还允许我们自定义对象的拷贝行为。我们可以通过实现对象的__copy__()和__deepcopy__()方法来定义自己的拷贝操作。
__copy__()方法用于实现浅拷贝,__deepcopy__()方法用于实现深拷贝。这两个方法在定义自定义类时可以被python调用来执行相应的拷贝操作。
例如,假设我们有一个自定义的类person:
```python
import copy
class person:
def __init__(self, name):
self.name = name
def __copy__(self):
return person(self.name)
def __deepcopy__(self, memo):
return person(copy.deepcopy(self.name, memo))
person1 = person("alice")
person2 = copy.copy(person1)
person3 = copy.deepcopy(person1)
print(person1.name) # alice
print(person2.name) # alice
print(person3.name) # alice
person1.name = "bob"
print(person1.name) # bob
print(person2.name) # alice
print(person3.name) # alice
```
在上面的例子中,我们实现了person类的__copy__()和__deepcopy__()方法,并使用copy模块对person1进行了浅拷贝和深拷贝。结果显示,对person1的修改仅影响了person1本身,而person2和person3保持不变。
总结:
在python中,我们可以使用浅拷贝和深拷贝来拷贝对象。浅拷贝仅复制对象的引用,而深拷贝递归地复制对象及其子对象。此外,我们还可以通过自定义类的__copy__()和__deepcopy__()方法来定义自己的拷贝行为。
原创文章,作者:admin,如若转载,请注明出处:https://www.qince.net/py/pylz60k.html