python--深浅拷贝

简介: python--深浅拷贝

深浅拷贝


  • 1. 直接赋值. 两个变量指向同一个对象.
  • 2. 浅拷贝:只拷贝第一层内容. copy()
  • 3. 深度拷贝: 对象中的所有内容都会被拷贝一份

拷贝比创建对象的过程要快


赋值


lst1 = ["金毛狮王", "紫衫龙王", ]
lst2 = lst1  # 列表,进行赋值操作. 实际上是引用内存地址的赋值. 内存中此时只有一个列表. 两个变量指向一个列表
lst2.append("白眉鹰王")  # 对其中的一个进行操作. 两个都跟着变
print(lst1, id(lst1))
print(lst2, id(lst2))

结果:

['金毛狮王', '紫衫龙王', '白眉鹰王'] 55256808
['金毛狮王', '紫衫龙王', '白眉鹰王'] 55256808

对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量. 并不是复制一份内容. 所以.ls2的内存指向和ls是一样的. ls改变了, ls2也发了改变


浅拷贝


浅拷贝 copy 创建新对象

lst1 = ["赵本山", "刘能", "赵四"]
lst2 = lst1.copy()  # lst2 和lst1 不是一个对象了
lst1.append("谢大脚")
print(lst1, id(lst1))
print(lst2, id(lst2))

结果:

['赵本山', '刘能', '赵四', '谢大脚'] 58861288
['赵本山', '刘能', '赵四'] 58898872

拷贝了一个新的对象,内存地址都不一样,lst1.append("谢大脚")只是给lst1添加了

可以用下图来表示整个过程

在来一个例子

lst1 = ["超人", "七龙珠", ["金城武", "渣渣辉"]]
lst2 = lst1.copy()  # 拷贝. 浅拷贝 拷贝第一层
lst1[2].append("大哥")
print(lst1, id(lst1))
print(lst2, id(lst2))

结果:

['超人', '七龙珠', ['金城武', '渣渣辉', '大哥']] 53918136
['超人', '七龙珠', ['金城武', '渣渣辉', '大哥']] 53917096

import copy
names = ["aa", 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
print(names)
name3 = copy.copy(names)  # name3=names.copy()
print(name3)
names[1] = 'LL'  # 改指定位置的元素
print(names)
print(name3)
names[2][0] = 'ZOU'
print(names)
print(name3)

结果:

['aa', 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
['aa', 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
['aa', 'LL', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
['aa', 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
['aa', 'LL', ['ZOU', 'xx'], 'cc', 'dd', 'ee', '77']
['aa', 'bb', ['ZOU', 'xx'], 'cc', 'dd', 'ee', '77']

Copy只copy第一个列表里的。如果列表里还有列表(只拷贝里面的内存地址),则里面的更改时copy的也会变  浅拷贝


深 copy


import copy
lst1 = ["超人", "七龙珠", ["金城武", "渣渣辉"]]
lst2 = copy.deepcopy(lst1)  # 把lst1扔进去进行深度拷贝 , 包括内部的所有内容进行拷贝
lst1[2].append("大哥")
print(lst1, id(lst1))
print(lst2, id(lst2))

结果:

['超人', '七龙珠', ['金城武', '渣渣辉', '大哥']] 46314920
['超人', '七龙珠', ['金城武', '渣渣辉']] 46314240

引用import copy的deepcopy则复制的不随着更改而改变,因为内存地址也复制了一份,内存地址也改变了

import copy
names = ["aa", 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
print(names)
name3 = copy.deepcopy(names)
print(name3)
names[1] = 'LL'
print(names)
print(name3)
names[2][0] = 'ZOU'
print(names)
print(name3)

结果:

['aa', 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
['aa', 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
['aa', 'LL', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
['aa', 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']
['aa', 'LL', ['ZOU', 'xx'], 'cc', 'dd', 'ee', '77']
['aa', 'bb', ['zou', 'xx'], 'cc', 'dd', 'ee', '77']

相关文章
|
6天前
|
Python
深入理解Python数据结构中的深浅拷贝
深入理解Python数据结构中的深浅拷贝
|
9月前
|
Python
Python | Python学习之深浅拷贝
Python | Python学习之深浅拷贝
|
存储 Python
【Python零基础入门篇 · 11】:类型转换和深浅拷贝,可变对象和不可变对象、pass语句
【Python零基础入门篇 · 11】:类型转换和深浅拷贝,可变对象和不可变对象、pass语句
【Python零基础入门篇 · 11】:类型转换和深浅拷贝,可变对象和不可变对象、pass语句
|
Java Python
Python基础 | 深浅拷贝问题、递归函数练习
在实际工作中,经常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题。为了防止数据被修改,就需要在传递一个副本,即使副本被修改,也不会影响原数据的使用。为了生成这个副本,就产生了拷贝。下面先了解一下几个概念:对象、可变类型、引用
218 0
Python基础 | 深浅拷贝问题、递归函数练习
|
Python
Python列表中的深浅拷贝,你学废了嘛?
Python列表中的深浅拷贝,你学废了嘛?
117 0
Python列表中的深浅拷贝,你学废了嘛?
|
Python
Python | Python学习之深浅拷贝
直接步入正题,聊一聊 Python 中的深浅拷贝
1706 0
|
Java Python
Python中深浅拷贝 垃圾回收与 super继承(六)
1 python拷贝 深拷贝,浅拷贝 与引用三者的区别 import copy a = [1, 2, 3, 4, ['a', 'b']] #原始对象 b = a #赋值,传对象的引用 c = copy.