鱼C论坛

 找回密码
 立即注册
查看: 80|回复: 5

请教一个列表操作的基本问题

[复制链接]
发表于 2021-10-14 09:00:05 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 dark-river 于 2021-10-14 09:04 编辑

将列表b整体作为元素append到列表a的末尾后,如果直接使用clear(),很奇怪已经append到列表A中的元素也被clear掉了。
  1. >>> a=[1,2,3]
  2. >>> b=[4,5]
  3. >>> a.append(b)
  4. >>> a
  5. [1, 2, 3, [4, 5]]
  6. >>> b
  7. [4, 5]
  8. >>> b.clear()
  9. >>> a
  10. [1, 2, 3, []]
  11. >>>
复制代码


但是,如果使用b=[],却对已经append到列表A中的内容没有影响,即使再使用了clear()方法也没有影响。

  1. >>> a=[1,2,3]
  2. >>> b=[4,5]
  3. >>> a.append(b)
  4. >>> a
  5. [1, 2, 3, [4, 5]]
  6. >>> b=[]
  7. >>> a
  8. [1, 2, 3, [4, 5]]
  9. >>> b.clear()
  10. >>> a
  11. [1, 2, 3, [4, 5]]
复制代码


请大佬帮忙解释一下这里面的玄机,谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-10-14 09:03:27 | 显示全部楼层
b被重新定义过
b = []
与原列表b = [4,5]切断了联系
改变b不会再影响a
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2021-10-14 09:28:31 | 显示全部楼层
本帖最后由 dark-river 于 2021-10-14 09:30 编辑
逃兵 发表于 2021-10-14 09:03
b被重新定义过
b = []
与原列表b = [4,5]切断了联系


那也就是说,即使将列表B append到列表A,此时A中的内容和外面的B是有关联的?
你这么一说,我改为使用copy()方法,就可以切段联系了
  1. >>> a=[1,2,3]
  2. >>> b=[4,5]
  3. >>> a.append(b.copy())
  4. >>> a
  5. [1, 2, 3, [4, 5]]
  6. >>> b
  7. [4, 5]
  8. >>> b.clear()
  9. >>> a
  10. [1, 2, 3, [4, 5]]
  11. >>> b
  12. []
  13. >>>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-10-14 09:30:52 | 显示全部楼层
dark-river 发表于 2021-10-14 09:28
那也就是说,即使将列表B append到列表A,此时A中的内容和外面的B是有关联的?

是的,就像班级里的学生,班级是总体,学生是个体
学生个体的变化会影响班级整体的情况
  1. >>> a.append(b)
  2. >>> a
  3. [1, 2, 3, [4, 5]]
  4. >>> b.clear()
  5. >>> a
  6. [1, 2, 3, []]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-10-15 11:25:21 | 显示全部楼层
解决方法:
  1. a = [1, 2, 3]
  2. b = [4, 5]
  3. a.append(b[:]) # 这里只取 b 里面的值,不是 b 的内存地址
  4. b.clear()
  5. print(a) # 就算 b.clear() 了,a 还是保留了值
复制代码
  1. [1, 2, 3, [4, 5]]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-10-15 16:34:10 | 显示全部楼层
本帖最后由 Stubborn 于 2021-10-15 16:44 编辑

https://fishc.com.cn/forum.php?m ... p;page=1#pid5596145   
关于我回复的11楼,讲的很精细了。
在python里面你要知道一个点,变量到底是什么?讲解的都时候,我更愿意叫他标签,贴在某个数据集上面。派森是通过标签找到数据集然后去操作。

如你发的代码,你分别建立两个数据集,。贴上ab两个标签,然后你通过b标签,把b标签的数据集打包放到a的数据集里面,但是此时你任然可以通过b这个标签去操作数据集,会影响到a。

第二段操作,你把b标签的数据集打包放到a的数据集里面,然后你干了什么呢?你又建议一个数据寄,在这个数据集上面贴个b的标签,告诉派森,如果有b的标签,可以到这里来(新建的数据集)自然而然影响不到a的数据集了。

另外说下5楼的,b[:]这个操作,会重新拷贝一个新的数据集,故而也不会影响

执行a.append(b)代码后,你可以很直观的看到是这样的,所以可以通过b去影响到a里面的数据,执行b=[],之后,b的指向就不是原来的列表了
123.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2021-10-23 03:53

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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