鱼C论坛

 找回密码
 立即注册
查看: 2344|回复: 10

[已解决]新手提问,关于python的列表复制

[复制链接]
发表于 2016-11-30 08:17:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
关于Python视频第十二讲课后的习题:列表复制的问题,我想问这个代码,一次改变列表中嵌入列表的元素,为什么都会对list2、list3、list4造成相同变化?
list1 = [1, 3, 2, [0,9], 7, 8]
list2 = list1[:]
print(list2)
list3 = list1
print(list3)
list4=list1.copy()
print(list4)

list1[1]=55
print(list2)
print(list3)
print(list4)

list1[3][1]=99
print(list2)
print(list3)
print(list4)

最佳答案
2016-11-30 11:55:15
list3是和;list1指向的同一个地址,所以当list1改变时list3会跟着变
list2和list4对弈简单的列表,也就是说列表中都是基本元素,如果列表元素还存在列表的话,这种方法就不适用了。原因就是,象a[:]这种处理,只是将列 表元素的值生成一个新的列表,如果列表元素也是一个列表,如:a=[1,[2]],那么这种复制对于元素[2]的处理只是复制[2]的引用,而并未生成 [2]的一个新的列表复制。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-11-30 11:55:15 | 显示全部楼层    本楼为最佳答案   
list3是和;list1指向的同一个地址,所以当list1改变时list3会跟着变
list2和list4对弈简单的列表,也就是说列表中都是基本元素,如果列表元素还存在列表的话,这种方法就不适用了。原因就是,象a[:]这种处理,只是将列 表元素的值生成一个新的列表,如果列表元素也是一个列表,如:a=[1,[2]],那么这种复制对于元素[2]的处理只是复制[2]的引用,而并未生成 [2]的一个新的列表复制。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-1 08:48:35 | 显示全部楼层
小茗同学 发表于 2016-11-30 11:55
list3是和;list1指向的同一个地址,所以当list1改变时list3会跟着变
list2和list4对弈简单的列表,也就是 ...

你好,我也在查找楼主问题的答案,但自己在探究的时候,尝试修改原列表嵌套列表的元素出现了一个更奇怪的问题!!!
前面的代码跟楼主是一模一样的,下面的代码是我自己探究的

  1. list1[3]=list1[3].append([0,0,0])
  2. print('为list1[3]增加一个[0,0,0]元素后,分片、贴标签和copy()得到三个列表')
  3. print('分片得到的', list2)
  4. print('贴标签得到的',list3)
  5. print('copy()得到的', list4)
  6. =================================================
  7. 为list1[3]增加一个[0,0,0]元素后,分片、贴标签和copy()得到三个列表
  8. 分片得到的 [1, 3, 2, [0, 99, [0, 0, 0]], 7, 8]
  9. 贴标签得到的[1, 55, 2, None, 7, 8]
  10. copy()得到的 [1, 3, 2, [0, 99, [0, 0, 0]], 7, 8]
复制代码

为什么修改了list1之后分片得到list2和copy()得到list4修改是按设想的方向改的,但是贴标签的list3居然是直接报None???
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-1 14:28:35 | 显示全部楼层
Spiderss 发表于 2016-12-1 08:48
你好,我也在查找楼主问题的答案,但自己在探究的时候,尝试修改原列表嵌套列表的元素出现了一个更奇怪的 ...

因为这个时候的list1也是None,特别羡慕你们能发现问题,目前我还不知道,大家共同学习,等我知道后再告诉你哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-1 14:42:54 | 显示全部楼层
问题出在 list1[3]=list1[3].append([0,0,0])
.append()是为列表增加元素,但其没有返回值,或返回值为None。
这里执行等号右边的,值为 [1, 3, 2, [0, 99, [0, 0, 0]], 7, 8]
接着又把None给了list1[3],替换了 [0, 99, [0, 0, 0]],就出现了现在的结果

评分

参与人数 2荣誉 +2 鱼币 +2 收起 理由
Spiderss + 1 + 1 感谢楼主无私奉献!
小茗同学 + 1 + 1 谢谢

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2016-12-2 18:43:43 | 显示全部楼层
本帖最后由 Spiderss 于 2016-12-2 18:52 编辑
冬雪雪冬 发表于 2016-12-1 14:42
问题出在 list1[3]=list1[3].append([0,0,0])
.append()是为列表增加元素,但其没有返回值,或返回值为Non ...


谢谢您的回答@冬雪雪东,我自己试了一下把我代码上的list1=list1[3].append([0,0,0])的左边部分去掉,果然得到的是三个第三个元素完全一样的列表。

  1. list1[3].append([0,0,0])
  2. print('为list1[3]增加[0,0,0]后,分片、贴标签和copy()得到三个列表')
  3. print('分片得到的', list2)
  4. print('贴标签得到的',list3)
  5. print('copy()得到的', list4)
  6. ==========================================
  7. 为list1[3]增加[0,0,0]后,分片、贴标签和copy()得到三个列表
  8. 分片得到的 [1, 3, 2, [0, 99, [0, 0, 0]], 7, 8]
  9. 贴标签得到的 [1, 55, 2, [0, 99, [0, 0, 0]], 7, 8]
  10. copy()得到的 [1, 3, 2, [0, 99, [0, 0, 0]], 7, 8]
复制代码

但是,我查了Python3.5.2的Help=>documentation只说=>为数组的末尾添加一个值为x的对象
发现并没有您说的
.append()是为列表增加元素,但其没有返回值,或返回值为None。
如下图,问题来了,请问您是如何获取这个知识点的?
append.PNG
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-2 21:10:58 | 显示全部楼层
Spiderss 发表于 2016-12-2 18:43
谢谢您的回答@冬雪雪东,我自己试了一下把我代码上的list1=list1[3].append([0,0,0])的左边部分去掉, ...

其实在小甲鱼视频教程里都有讲解。
这里主要涉及可变变量和不可变变量的问题。
列表是可变变量,它的方法如append是改变列表本身无需返回值。
而相应的字符串是不可变变量,就需要返回值来实现方法对其的改变,如:
str1 = 'abc'
str2 = str1.upper()
str1
'abc'
str2
'ABC'
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-12-5 12:47:53 | 显示全部楼层
冬雪雪冬 发表于 2016-12-2 21:10
其实在小甲鱼视频教程里都有讲解。
这里主要涉及可变变量和不可变变量的问题。
列表是可变变量,它的方 ...

看来我听课还是不够仔细
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-13 17:07:54 | 显示全部楼层
我后来找了答案,就是用列表分片[:]和用list1.copy()进行复制的时候,只能对列表的一层元素进行复制,列表里面的列表不是复制,而是引用。要对列表完全复制,要用外置函数
import copy
list2=copy.deepcopy(list1)
即可对列表进行完全的复制
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-13 17:21:40 | 显示全部楼层
我也不懂,同求答案...在綫等,挺急的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-13 20:43:33 | 显示全部楼层
冬雪雪冬 发表于 2016-12-1 14:42
问题出在 list1[3]=list1[3].append([0,0,0])
.append()是为列表增加元素,但其没有返回值,或返回值为Non ...

这样说我就明白了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-24 06:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表