深拷贝,浅拷贝,面试重要

本文深入探讨了Python中列表的基本操作,如修改、拷贝及引用,并解析了浅拷贝与深拷贝的区别。通过实例展示了列表操作的常见误区,帮助读者理解列表在不同操作下的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 思考下面的代码运行出的结果是什么:
    list = [0, 1, 2]
    list[1] = list
    print(list)

    list的第2个元素指向list本身, 所以无限循环

  2. 如何得出list = [0, [0, 1, 2], 2]这样的结果?

    list[1] = list[:]

  3. 经过以下步骤, a和b分别是多少? 为什么?
    a = [0, [1, 2], 3]

    b = a[:]
    a[0] = 8
    a[1][1] = 9

a[:]是浅拷贝, 只对对象最顶层进行拷贝

  1. 如何保证第3题中最终b = [0, [1, 2], 3]

    使用深拷贝

  2. 写出下面代码执行结果:
    L = [1, 2]
    M = L
    L = L + [3, 4]
    print(L)
    print(M)

  3. 写出下面代码执行结果:
    L = [1, 2]
    M = L
    L += [3, 4]
    print(L)
    print(M)

    L += [3, 4] 是L本身加上[3, 4]

    L = L + [3, 4] 先计算等号右边, 得到一个新的引用, 指向新的L(等号右边的L是原来的L, 等号左边的是一个新的L)

  4. 执行以下代码:

def foo(a, b, c=[]):
c.append(a)
c.append(b)
print©

foo(1, 2) python解释器没有接收到c的参数, 使用默认的空列表(缺省参数)

foo(1, 2, []) python解释器接收到新的c的参数, 就是用新的空列表, 此时, 缺省参数的列表已经变为[1, 2]

foo(3, 4) python解释器没有接收到c的参数, 继续使用默认的缺省列表, 即[1, 2].append[3, 4]

a = [0,1,2,3]

a[10] 不存在这个元素, 报错(下标越界)
a[10:] 因为列表切片返回一个列表, 当下表越界时, 返回空列表, 不报错

### Java 深拷贝浅拷贝的区别 在 Java 中,深拷贝浅拷贝是对象复制时采用的不同策略。 #### 浅拷贝 (Shallow Copy) 浅拷贝是指创建一个新的对象,这个新对象会复制原对象的基本数据类型字段值;而对于引用类型的字段,则只是复制了引用地址而不是实际的对象实例。这意味着如果修改其中一个对象的引用类型成员变量的内容,另一个对象也会受到影响[^1]。 ```java public class ShallowCopyExample implements Cloneable { private int value; private String reference; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } ``` #### 深拷贝 (Deep Copy) 相比之下,深拷贝不仅复制基本数据类型的字段值,还会为每一个可变的引用类型字段创建新的副本,从而使得两个对象及其内部的所有组件都是完全独立的实体。因此,在进行了深拷贝之后,即使改变源对象的状态也不会影响到目标对象[^4]。 为了实现深拷贝,可以采取多种方法: - 使用序列化机制来完成自动化的深拷贝操作; - 手动编写构造函数或静态工厂方法来进行逐个字段的手工克隆; - 利用第三方库如 Apache Commons Lang 的 `SerializationUtils` 或者 Google Guava 提供的相关工具类。 ```java import java.io.*; public class DeepCopyExample implements Serializable { private static final long serialVersionUID = 1L; public Object deepClone() throws IOException, ClassNotFoundException { // 将当前对象写入流中再读取来达到深拷贝效果 ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return ois.readObject(); } } ``` ### 面试常见问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值