Python 3.x浅拷贝和深拷贝

    技术2024-11-12  7

    浅拷贝和深拷贝

    变量标签,一个变量可以有一个标签,也可以有多个标签;一个标签可以指向一个数据,也可以指向另一个数据。

    所谓深拷贝就是对对象的资源的拷贝 所谓浅拷贝就是对引用的拷贝

    Python默认复制对象是浅拷贝,是两个标签指向同一份数据,通过任何一个标签修改数据,都会改变。但如果指向改变其中一个标签的数据,另一个不希望被改变,该怎么做呢?

    –浅拷贝

    import copy a=[1,2,3,['a','b','c']] b=a c=copy.copy(a) id(a) id(b) id(c) c是独立的新开辟的地址空间,与a无关系 a.append('d') b c 此时修改a对象,c已经不会受影响

    下面我们尝试改变深层的子对象,但需要注意一点,修改的子对象必须是可变类型,比如数字,字符串,元组属于不可数据类型。 id(a[3]).append(‘d’) c[3] 也发生改变了 c 浅拷贝,更深层特点,父对象里面的子对象地址空间竟然是相同的。无论是可变类型子对象,还是不可变类型子对象地址都是相同的,当然指的是copy()操作时已有的对象,如果拷贝后添加新对象,则不受影响。

    id(a[0]) id(c[0]) id(a[3]) id(c[3])

    –深拷贝

    d=copy.deepcopy(a) d a.append('d') d 使用深拷贝,相当于两个完全独立对象 id(d) id(a) 对子对象的更改 a[3].append('a3') d[3].append('d3') a d id(a[3]) id(d[3]) //对于可变数据类型的对象,地址已经发生彻底改变 id(a[0]) id(d[0]) //对于不可变数据类型的对象,地址未改变,看似依然像浅拷贝

    总结:浅拷贝把父对象拷贝出来,但使用的数据同一地址空间,深拷贝是完全把对象独立出来。但深拷贝浅拷贝,对于不可变数据类型的对象,都只用同一份,一旦使用索引index修改不可变数据类型对象,实际就开辟了新地址空间,贴变量标签

    Processed: 0.020, SQL: 9