python关于深复制浅复制

深复制浅复制均会重新分配一块内存地址,其区别在于深复制会递归遍历为每层都分配一个新的地址,而浅复制只分配最外层地址。但不可变类型(如string、tuple、int)的均不会重新分配地址

1、浅复制例子说明


import copy

a = [1,[2,3]]

b = copy.copy(a)

b[0] ='z'

b[1][0] ='two'

print(id(a),id(b))

print(id(a[1]),id(b[1]))

print(a,b)

结果如下:

17764040 17404360
17871368 17871368
[1, ['two', 3]] ['z', ['two', 3]]

浅复制a和b内存地址不同,其内层列表[2,3]地址相同,改变b外层值不会影响a,而改变内层值a和b的内层值都会改变,因为它们指向同一个地址

2、深复制例子说明

import copy

a = [1,[2,3]]
b = copy.deepcopy(a)
b[0] = 'z'
b[1][0] = 'two'
print(id(a),id(b))
print(id(a[1]),id(b[1]))
print(a,b)

结果如下:

17895112 17894792
18003592 18002824
[1, [2, 3]] ['z', ['two', 3]]

深复制最外层列表和内层列表的地址均重新分配,改变a或b的值不会相互影响

3、不可变类型

import copy
a = '123456'
b = copy.copy(a)
c = copy.deepcopy(b)
print(id(a),id(b),id(c))

结果如下:

6851248 6851248 6851248

a,b,c均指向同一个内存地址

4、关于赋值

import copy

a = [1,[2,3]]
b = a
b[0] = 'one'
print(id(a),id(b))
print(id(a[1]),id(b[1]))
print(a,b)

结果如下:

17698504 17698504
17806792 17806792
['one', [2, 3]] ['one', [2, 3]]

a和b指向同一内存,b[0] = 'one'即修改该内存里的值,故a也会改变。

import copy

a = '123'
b = a
b = '1'
print(id(a),id(b))
print(a,b)

结果如下:

8088632 4781928
123 1

b ='1'即b指向了另一个地址,并不是改变a指向的地址的值

你可能感兴趣的:(python关于深复制浅复制)