什么是拷贝:
python 中拷贝是指创建一个新的对象,其中包含了原始对象的值,以便于在不改变原始对象的情况下进行操作。拷贝在处理数据时非常有用,特别是当我们需要对数据进行修改而又不想影响原始数据时。
2.浅拷贝
浅拷贝的规则如下: 被拷贝的对象如果是可变对象,则会生成新的对象,但仅是对可变对象外面壳子进行拷贝
不可变对象:如果被拷贝的对象是不可变对象,则不会生成新的对象。
可变对象: list set dict
不可变对象: 数字 string tuple
浅拷贝是指创建一个新的对象,改对象的深层内容是对原始对象中各项的引用
换句话说,浅拷贝只是复制了外面的壳子,里面的内容还是指向原来数据的内存地址。
案例:
a = [1,2,3,[4,5,6],7,8,9]
# 其中 1,2,3,7,8,9 就是我所说的外边的壳子 当我们使用c = a.copy() 生成的新的对象,只是复制了外面的壳子 1,2,3,7,8,9 ,其中像 [4,5,6] 和a中的[4,5,6] 指向同一个内存地址。
浅拷贝拷贝了啥? 只是外边这个 list '[ ]', 不信你看?
python id() 函数的作用是返回对象的内存地址 同一个id 表示同一件东西
a = [1,2,3[4,5,6]]
b = a.copy()
id(a[1],a[3])
id(b[1],a[3])
说明了啥? 说明了浅拷贝只是创建了新的对象,就像 b 一样,相对于a来说只是创建了新的对象,其内容是原来对象的引用,,里面的东西和a 所指的是一个东西。
随着不断深入python 学习 ,对于给变量赋值: 只是存在指针一样引用的东西。
a = [1,2,3] 有个盒子 装了 [1,2,3] 我给这个盒子贴了一个标签,这个标签名是 a a 指向了这个盒子里面的[1,2,3] , 指向连接的关系我们可以把它称为引用。
可变对象的浅拷贝
在对,原对象浅拷贝后,无论是对原来可变对象还是经过浅拷贝后的对象的外部元素修改,也就是第一层元素修改,则相互不影响,但是如果是对深层次的元素做修改则相互影响
2 深拷贝:
深拷贝是拷贝了被拷贝对象的所有元素,包括嵌套元素,深拷贝出来的对象是一个全新的对象,不会与原来的对象之间有关系。
深拷贝我们需要使用 copy 模块中 deepcopy() 函数
改变原有对象 并不会对新复制的对象产生影响
注意: 不可变对象不能被拷贝 不论是深拷贝还是浅拷贝
深拷贝
浅拷贝
可变对象的深拷贝
有的同学说,那可变对象浅拷贝的id() 返回对象的内存地址也是不一样啊
但是我们去看看可变对象内部的元素位置是否一致,我们要知道深拷贝后可变对象,不论是内部还是整个可变对象体,它们的 内存位置都是内存给新分配的,而不是引用。
翻车了? 按照理解来经过深拷贝的对象整个对象的内存地址都会被重新分配,而测试结果却是还是引用了原来元素
# 这个有待大家去思考我也很疑惑?
我们为什么要用 id() 查看 对象的存储位置来看可变对象不可变对象 深拷贝与浅拷贝对对象的影响,因为id() 是查看对象在内存中的位置,如果产生了一个新的对象,也就是深拷贝,内存会为该新的对象分配位置,否则不会,如果我们通过 id() 函数查看对象的位置发生了变化即使深拷贝的影响,如果没变化则是浅拷贝的影响,但是还要注意浅拷贝中,可变对象与不可变对象,可变对象即是,对象中的元素可以被修改,不可变对象及对象中的元素,不能被修改
文章引用:Python中的赋值(复制)、浅拷贝与深拷贝 - 知乎 (zhihu.com)
作者: 高桌会