美文网首页
python —— 浅拷贝深拷贝(可变和不可变类型)

python —— 浅拷贝深拷贝(可变和不可变类型)

作者: mutang | 来源:发表于2021-02-02 19:49 被阅读0次

1. 简单可变类型拷贝

  1. 深拷贝
    • 会产生新的空间
    • 能够保持各自的独立性
    • 如果拷贝的对象,子对象也会拷贝(产生新的空间)
  2. 浅拷贝
    • 不会产生新的空间
    • 能够保持各自的独立性
    • 如果拷贝的对象,子对象也会拷贝(不会产生新的空间)

2. 复杂可变类型的深浅拷贝

  1. 深拷贝:

    • 拷贝的顶层对象和对象的子对象,子对象也会产生新的内存空间
  2. 浅拷贝:

    • 拷贝的是顶层对象,子对象不会拷贝(只是引用子对象)
    a = [11,22]
    b = [33,44]
    c = [a,b]
    c
    [[11, 22], [33, 44]]
    d = copy.copy(c)
    id(c[0])
    2683669746184
    id(d[0])
    2683669746184
    

3.简单不可变类型

都是浅拷贝

x = (1,2,3)
y = copy.copy(x)
e = copy.deepcopy(x)
id(x)
2683669740424
id(y)
2683669740424
id(e)
2683669740424

4. 复杂不可变类型

  • 深拷贝:这个数据是否有可变的数据类型,如果有,他就会开辟多个空间存储数据和地址,包装数据的独立性
  • 浅拷贝:只关心最外层的数据类型是什么,如果是不可变的类型,直接引用,没有办法保持数据的独立性
r = [11,22]
s = [33,44]
t = (r,s)
t1 = copy.copy(t)
id(t)
2683669749832
id(t1)
2683669749832
r.append(55)
t
([11, 22, 55], [33, 44])
t1
([11, 22, 55], [33, 44])
id(t)
2683669749832
id(t1)
2683669749832
t[0].append(55)
t
([11, 22, 55, 55], [33, 44])
t1
([11, 22, 55, 55], [33, 44])
t2 = copy.deepcopy(d)
t2 = copy.deepcopy(t)
id(t)
2683669749832
id(t2)
2683669755336
t[0].append(88)
t
([11, 22, 55, 55, 88], [33, 44])
t2
([11, 22, 55, 55], [33, 44])
id(t[1])
2683669894600
id(t1[1])
2683669894600
id(t2[1])
2683669753800

5.切片拷贝

  1. 简单类型

    等同于深拷贝,保证数据的独立性

a = [11,22]
b = a[:]
id(a)
2683669808776
id(b)
2683671397000
c = (11,)
d = c[:]
id(c)
2683669818840
id(d)
2683669818840
  1. 复杂类型

    可变:等同于浅拷贝,拷贝的是顶层对象,子对象不会拷贝(只是引用子对象)

    不可变:等同于引用

a
[11, 22]
b = [33,44]
c = [a,b]
c
[[11, 22], [33, 44]]
d = c[:]
id(c)
2683669808968
id(d)
2683671368904
id(c[0])
2683669808776
id(d[0])
2683669808776
c[0].append(2)
c
[[11, 22, 2], [33, 44]]
d
[[11, 22, 2], [33, 44]]


a
[11, 22, 2]
b
[33, 44]
c = (a,b)
c
([11, 22, 2], [33, 44])
d = c[:]
id(c)
2683671370760
id(d)
2683671370760
id(c[0])
2683669808776
id(d[0])
2683669808776
c[0].append(1)
c
([11, 22, 2, 1], [33, 44])
d
([11, 22, 2, 1], [33, 44])

6.字典拷贝

浅拷贝

dict1 = {'li': [11,22]}
dict2 = dict1.copy()
id(dict1)
2683661213272
id(dict2)
2683669738192
id(dict1['li'])
2683669843464
id(dict2['li'])
2683669843464
dict1['li'].append(33)
dict2
{'li': [11, 22, 33]}

相关文章

网友评论

      本文标题:python —— 浅拷贝深拷贝(可变和不可变类型)

      本文链接:https://www.haomeiwen.com/subject/ojxutltx.html