——.copy()——
.copy()的作用就是复制列表:
可以看到,将names复制了一份,赋给了names1。
接下来,我将对names中的值做修改,比如讲names中的“daji”改为“妲己”,那names1会有同样变化吗?我们来看一下。
可以看到,只有names中的“daji”变为了“妲己”,names1没有任何变化。(类似于之前讲的变量赋值{字符串、数字})
列表里面能不能包含列表呢?答案当然是可以的。比如我们在names里面再插入一个列表["libai","luna","ake"]。我们修改插入的列表的值,比如将“luna”换成“紫霞仙子”。我们看一下复制的names1会有什么样的变化。
可以看到不管是names还是复制出来的names1都发生了同样的变化。这是为什么呢?
.copy是一个浅copy,只能复制第一层,如果修改的是第二层及以上,则无法复制到。这是由内存的存储方式决定的,["libai","luna","lanlingwang"]这个列表在存储的时候实际是一个内存指针,当它做了修改之后,每次到这个列表的时候,复制的其实是这个内存地址,而这个内存地址总会指向修改后的内容。于是,便出现了上述的结果。浅copy的意思就是说,第二个列表的每个元素是第一个列表的每个元素的一个引用而已。
再考虑一点,如果我不是修改的names中的子列表,而是转换为修改names1中的子列表呢?
可以看到,结果是一样的,names和names1中的“luna”都变成了“紫霞仙子”。因为不论你修改谁,在调用到这个子列表的时候,都是一个内存地址,指向的是同样的一个内容。
考虑这样一个问题 ,如果我们不是用的names.copy,而是直接names= names1呢?
若是names=names1,则names1和names会完完全全的相同。
在这里要注意一个问题:若是数字和字符串的变量赋值,则是如下的规则(与之前讲的一致):
比如数字的:
再比如字符串的:
但是,若是列表之间的赋值,则就完全相同:
——copy.deepcopy(x)——
之前讲的.copy()是浅copy,那如果我现在就是想要一份完整的copy,那应该怎么办?
这时候就需要调用copy模块, 其中的copy.deepcopy(x)就是我们想要的深copy。我们来看一下代码:
确实是深copy。names1复制了names,并且names不管在第几层作了修改,names1都没有发生变化。
——copy.copy(x)——
除此之外,copy模块中也有.copy(x), 即copy.copy(x)。这个的功能跟.copy()是一模一样的:
——列表的循环——
格式如上图,可以看到第一次i取值为“anqila”,所以打印i为“anqila”,第二次i取值为["libai","luna","ake"]这个列表,所以打印i输出为["libai","luna","ake"],第三次i取值为“daji”,以此类推……
——列表的步长切片——
之前for循环里面,提到了可以隔一个打印一个,或者隔两个打印一个,即步长的问题。列表也可以有步长的切片。格式与 for循环的相同:
列表名[起始位置:终止位置: 步长]
注意一点:这里的终止位置是不包括在内的(与for循环相同)。
可以看到从0开始,到10结束,打印偶数,只打印了0,2,4,6,8,没有10。
同样的:
可以看到,同样没有包括“wangzhaojun”。
若是省略掉0和-1,即names[::2],这样则是包含整个列表,包括最后一个位置在内的。
如果我继续省略掉步长,即步长为1,则为names[ : ],这时候便是复制整个列表。
网友评论