学过python 列表一章的想必都知道,
列表的复制
a = [2,3,4]
#复制
b = a[:]
没错,复制的确是这样。
为什么要复制,为了 在使用到a列表内的数据时 不会对a列表中的数据产生修改,丢失。
所以就使用a 的复制品 b
一样的作用,使用起来更随意,还不用担心数据丢失
没接过的可能会想
b = a
这样不就行了吗
哈哈,不行哦
b = a
这样的叫列表赋值 而之后 a与b 指向同一块地址
这时的a就是b ,b就是a 无真假之分
当 b 被修改之后 a 中的数据也随之改变
一维的复制我们知道
让你更透彻的理解复制 浅复制、深复制
b = a[:]
这样一种方法去复制
但二维的这样行不行呢?
a = [[1,2],[3,4],[5,6]]
b = a[:]
输出 b 会是怎样的?
从上图可以看到
输出的 b 的确和 a一模一样
那我们改一改 b 看 b是不是货真价实的赝品
b.append([9,9])
print(b)
print(a)
我们发现好像二维 的这样复制也是行得通的
那我们再看看下面的情况
b[1].append(9)
print(b)
print(a)
我们会发现在b的第二个列表 添加元素时 a 也发生了一样的行为
?
前面,不是还行得通,怎么在改变 b 的元素列表内的元素时 就影响到 a 了呢
那么这样的复制方式不再能达到我们复制的目的
为什么会如此?
b = a
a是一个二维列表
当复制给b 的时候 b会在内存空间内开辟一个新的空间
从图可知道,b的确是另起炉灶了。
所以我们在修改列表b的元素(第一层元素)时不会影响到a
但是 在修改元素的元素(第二层元素)时 a就发生了相应改变
那也就是说
二维列表a 内存储的一维列表 其实是一个个指向某存储空间的地址指针(请允许我这么说,因为python是用c写的)
当 把 a 复制一遍的时候 a[:]与a 内的一维列表地址是没有变的
而因为 地址一样所以 只要是从a赋给b的,不论是在b中修改一维列表内的元素还是在a中修改 操作指令的对象都是指向同一处 也就是针对同一个对象。
上图变说明了这一点
a [1] 的地址与b[1] 的是一样的