import copy
a = [1,2,3,4,[5,6,7]]
a_1 = a # 对a的引用
a_copy = copy.copy(a) # 对 a 的浅拷贝
a_deep = copy.deepcopy(a) # 对 a 的 深拷贝
1. 引用
a_1 = a
等价于 a_1与a 完全相同,指向与同一个地址,无论改变 a 还是改变 a_1, 另外一个都会发生改变
2. 浅拷贝
a_copy = copy.copy(a)
只会拷贝浅层次的元素,即第一级元素,深成次的不会拷贝,依然是引用,即上例中的 a[0], a[1], a[2], a[3]会拷贝,而最后一个元素是一个 list,因此不会被拷贝;即改变 a 中的a[0], a[1], a[2], a[3],浅拷贝 a_copy 不会发生变化,但 改变 a[4](即 a 中的 list)会导致 a_copy 发生变化
3. 深拷贝
a_deep = copy.deepcopy(a)
深拷贝相较于浅拷贝会复制其深层次的元素,与原来的 a 没有任何关系,只是值相同的两个变量而已,深拷贝与原对象不会对对方造成影响.


注意以下代码:

-
for in
属于浅拷贝,即只拷贝第一级元素,不会拷贝深层次的元素 - 第一部分,对
i[0]
进行操作,即进入到深层次的(下一级的)元素,因此会对原始数据产生影响 - 第二部分, 只是对
i
进行操作,在同级同层次下,因此不会对原始数据产生影响
4. 分片操作

-
list[indexStart: indexEnd: step]
, 当step>0的时候,正向取值, 也就是从左往右取值,当step<0时,逆向取值。所以l[::-1]都是取的列表的逆序表, 也就是从右往左取值。 -
分片操作其实就是按照一定的顺序访问序列中某一范围内的元素,记住一点就行了,那就是在一定的访问顺序中,indexStart所对应的元素必须先于indexEnd所对应的元素被访问到,否则,分片操作返回的就是空的序列;而访问元素的顺序由step决定是从左往右,还是从右往左。
-
因此,l[0: -1: -1]是取不到值的。step < 0 ,从右往左访问数据, 先访问到得是indexEnd,再访问到indexStart。因此取到得得列表是空列表。
参考:https://blog.csdn.net/w494675608/article/details/82114798
网友评论