返回

浅拷贝的五种实现方式,Python大作战!

前端

浅拷贝的五种实现方式

浅拷贝是复制对象的一种方法,它只复制对象本身的数据,而不会复制对象引用的其他对象。这是一种浅层次的复制,与深拷贝相反,深拷贝会复制对象及其引用的所有对象。

在Python中,有五种常见的浅拷贝实现方式:

  1. Object.assign()

    Object.assign()是JavaScript中一种浅拷贝方法,它可以将一个或多个源对象的可枚举属性复制到目标对象。

    const target = { a: 1, b: 2 };
    const source = { c: 3, d: 4 };
    
    Object.assign(target, source);
    
    console.log(target); // { a: 1, b: 2, c: 3, d: 4 }
    

    Object.assign()方法非常简单易用,但它也有一个缺点,那就是它只能复制可枚举的属性。这意味着如果源对象中有不可枚举的属性,这些属性将不会被复制到目标对象。

  2. Object.create()

    Object.create()是JavaScript中一种创建新对象的工厂方法,它可以创建一个新对象,该对象继承自一个现有的对象。

    const parent = { a: 1, b: 2 };
    const child = Object.create(parent);
    
    child.c = 3;
    
    console.log(child); // { a: 1, b: 2, c: 3 }
    

    Object.create()方法可以创建浅拷贝,因为它只会复制父对象的可枚举属性。这意味着如果父对象中有不可枚举的属性,这些属性将不会被复制到子对象。

  3. 扩展运算符(...)

    扩展运算符(...)是JavaScript中一种展开数组或对象的语法,它可以将数组或对象的元素展开为单独的元素。

    const arr1 = [1, 2, 3];
    const arr2 = [...arr1];
    
    arr2.push(4);
    
    console.log(arr1); // [1, 2, 3]
    console.log(arr2); // [1, 2, 3, 4]
    

    扩展运算符可以用来创建浅拷贝,因为它只会复制数组或对象的元素,而不会复制数组或对象本身。这意味着如果数组或对象中包含引用类型的值,这些值不会被复制到新数组或新对象。

  4. Array.from()

    Array.from()是JavaScript中一种将类数组对象转换为数组的方法,它可以将类数组对象中的元素转换为数组中的元素。

    const arrLike = { 0: 1, 1: 2, 2: 3 };
    const arr = Array.from(arrLike);
    
    arr.push(4);
    
    console.log(arrLike); // { 0: 1, 1: 2, 2: 3 }
    console.log(arr); // [1, 2, 3, 4]
    

    Array.from()方法可以用来创建浅拷贝,因为它只会复制类数组对象中的元素,而不会复制类数组对象本身。这意味着如果类数组对象中包含引用类型的值,这些值不会被复制到新数组。

  5. Array.slice()

    Array.slice()是JavaScript中一种从数组中截取元素的方法,它可以从数组中截取指定范围的元素。

    const arr = [1, 2, 3, 4, 5];
    const newArr = arr.slice(1, 3);
    
    newArr.push(6);
    
    console.log(arr); // [1, 2, 3, 4, 5]
    console.log(newArr); // [2, 3, 6]
    

    Array.slice()方法可以用来创建浅拷贝,因为它只会复制数组中指定范围的元素,而不会复制数组本身。这意味着如果数组中包含引用类型的值,这些值不会被复制到新数组。

浅拷贝的优缺点

浅拷贝的优点包括:

  • 速度快 :浅拷贝比深拷贝速度更快,因为它只需要复制对象本身的数据,而不需要复制对象引用的其他对象。
  • 内存消耗少 :浅拷贝比深拷贝内存消耗更少,因为它只需要分配新的内存空间来存储对象本身的数据,而不需要分配新的内存空间来存储对象引用的其他对象。

浅拷贝的缺点包括:

  • 不复制引用类型的值 :浅拷贝不会复制引用类型的值,这意味着如果对象包含引用类型的值,这些值不会被复制到新对象。
  • 不复制不可枚举的属性 :浅拷贝不会复制不可枚举的属性,这意味着如果对象包含不可枚举的属性,这些属性不会被复制到新对象。

结论

浅拷贝是一种复制对象的方法,它只复制对象本身的数据,而不会复制对象引用的其他对象。浅拷贝的优点包括速度快和内存消耗少,缺点包括不复制引用类型的值和不复制不可枚举的属性。在选择浅拷贝还是深拷贝时,应根据具体情况权衡利弊。