3-8 Python基础练习题:深拷贝与浅拷贝

一、深拷贝与浅拷贝的区别

1.什么是深拷贝?什么是浅拷贝?
2.Python中如何实现深拷贝?
3.思考:Python中如何正确初始化一个二维数组?

### 深拷贝浅拷贝的区别 深拷贝浅拷贝的主要区别在于它们如何处理复杂的数据结构以及引用类型的数据。以下是两者的具体定义及其差异: #### 1. **浅拷贝** 浅拷贝是指创建一个新的对象,但是该对象中的元素仍然是对原对象中元素的引用。这意味着如果原对象中的某些元素是可变的对象(如列表、字典等),那么这些对象在新对象和原对象之间是共享的。 - 如果原始数据是基本类型,则浅拷贝会直接复制值。 - 如果原始数据是引用类型,则浅拷贝只会复制引用地址[^2]。 例如,在 Python 中可以使用 `copy.copy()` 方法来完成浅拷贝操作[^3]。 ```python import copy a = [[1, 2], [3, 4]] b = copy.copy(a) print(b is a) # False,表示 b 和 a 是不同的对象 print(b[0] is a[0]) # True,表示 b[0] 和 a[0] 共享相同的内存位置 ``` #### 2. **深拷贝** 深拷贝不仅创建了一个新的对象,还递归地复制了所有嵌套的对象。这使得新对象其副本完全独立,即使其中包含了其他可变对象也不会相互影响。 - 对于任何类型的元素,无论是基本类型还是引用类型,都会被彻底复制到新的内存区域中。 可以通过 `copy.deepcopy()` 来实现深拷贝操作。 ```python import copy a = [[1, 2], [3, 4]] d = copy.deepcopy(a) print(d is a) # False,表示 d 和 a 是不同的对象 print(d[0] is a[0]) # False,表示 d[0] 和 a[0] 不再共享相同内存位置 ``` --- ### 练习题目 为了更好地理解和掌握深拷贝浅拷贝的概念,下面提供一些常见的练习题供参考: #### 题目 1 给定一个二维数组 `matrix`,尝试通过浅拷贝的方式对其进行复制并修改其中一个子数组的内容,观察原数组的变化情况。 ```python import copy matrix = [[1, 2], [3, 4]] shallow_copy = copy.copy(matrix) shallow_copy[0][0] = 99 print("Original Matrix:", matrix) # 输出应显示变化后的矩阵 print("Shallow Copy:", shallow_copy) ``` #### 题目 2 同样基于上述二维数组 `matrix`,这次采用深拷贝方式对其复制后再进行类似的修改操作,验证两者之间的关系是否发生变化。 ```python import copy matrix = [[1, 2], [3, 4]] deep_copy = copy.deepcopy(matrix) deep_copy[0][0] = 99 print("Original Matrix:", matrix) # 应保持不变 print("Deep Copy:", deep_copy) ``` #### 题目 3 (C++) 对于 C++ 用户来说,考虑以下代码片段的行为,并分析为什么会出现特定的结果。 ```cpp #include <iostream> using namespace std; class Test { public: int* ptr; Test(int i) { ptr = new int(i); } ~Test() { delete ptr; } // 默认赋值运算符行为 }; int main() { Test t1(10); // 创建对象 t1 并初始化 *ptr=10 Test t2 = t1; // 使用默认赋值操作符 *(t2.ptr) = 20; // 修改 t2 的指针所指向的值 cout << "Value pointed by t1: " << *(t1.ptr) << endl; // 结果是什么? } ``` 此程序展示了当未重载赋值运算符时发生的浅拷贝现象,最终可能导致悬空指针等问题[^5]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值