考虑以下代码片段:
代码执行过程:1. 初始化列表 `a = [1, 2, 3]`;2. `b = a` 使得 `b` 和 `a` 引用同一个列表对象;3. `a[0] = 99` 修改列表,`a` 和 `b` 变为 `[99, 2, 3]`;4. `c = a[:]` 创建 `a` 的浅拷贝,生成新列表 `[99, 2, 3]`,`c` 独立;5. `a[1] = 88` 再次修改 `a` 和 `b`(引用相同对象),变为 `[99, 88, 3]`,但 `c` 不变,仍为 `[99, 2, 3]`。因此,`b` 为 `[99, 88, 3]`,`c` 为 `[99, 2, 3]`,选项 C 正确。
浅拷只换箱子,不换里面的东西
1. 引用赋值(如 b = a) 并没有复制数据,只是让 b 指向 a 所指向的同一个对象。 相当于“共享同一个地址”。 修改一个,另一个也会变。 2. 浅拷贝(如 c = a[:] 或 c = a.copy()) 创建了一个新的列表对象,但元素是原对象中元素的引用。 对于不可变元素(如整数、字符串),看起来就是完全独立的。 对于可变元素(如列表中的子列表),内部仍共享引用。 在本题中,a = [1, 2, 3] 的元素都是整数(不可变),所以浅拷贝的效果等同于“完全独立的副本”。 3. 深拷贝(deep copy) 使用 copy.deepcopy(),会递归地复制所有嵌套对象。 只有在有嵌套可变对象时,才和浅拷贝有区别。