11

作者: 可爱叽叽 | 来源:发表于2019-02-18 11:54 被阅读0次

    ——.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[ : ],这时候便是复制整个列表。

    相关文章

      网友评论

          本文标题:11

          本文链接:https://www.haomeiwen.com/subject/bysmeqtx.html