鱼C论坛

 找回密码
 立即注册
查看: 2085|回复: 21

[已解决]关于list.remove的问题,小白求教

[复制链接]
发表于 2018-2-8 21:16:38 | 显示全部楼层 |阅读模式

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

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

x
在做16课课后题时开始用如下代码

  1. num = input('请输入需要计算的数字,用’,‘隔开:')
  2. num_list = num.split(',')
  3. new_list = []

  4. for each in num_list:
  5.     if each.isdecimal():
  6.         new_list.append(int(each))
  7.     else:
  8.         num_list.remove(each)
  9.         
  10. result = sum(new_list)
  11. print('和为:%d' % result)
复制代码


之后发现不行就改成下面这样
  1. num = input('请输入需要计算的数字,用’,‘隔开:')
  2. num_list = num.split(',')
  3. new_list = []

  4. for each in num_list[:]:
  5.     if each.isdecimal():
  6.         new_list.append(int(each))
  7.     else:
  8.         num_list.remove(each)
  9.         
  10. result = sum(new_list)
  11. print('和为:%d' % result)
复制代码


输入:12,54,dsf,432,sd3,54,fs,34
但是两段代码运行之后,为什么num_list的值相同,而new_list却不一样呢,list.remove是通过什么方式删除掉列表里的元素的,为什么加不加[:]只影响new_list而没有影响num_list.
最佳答案
2018-2-9 20:03:22
纸人无敌 发表于 2018-2-9 19:53
额,,,,其实我想表达的是为什么加不加[:],num_list的结果都一样而new_list的结果却不一样,

1.因为程序里面使用remove() 方法的是 num_list ,而不是 num_list[:],
所以两个程序里 num_list 都改变了而且元素相等。
2.new_list不一样是因为第一个程序是对num_list进行循环,而num_list是在改变的;
而第二个程序是对num_list[:]进行循环,而num_list[:]并未改变。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-2-8 21:22:48 | 显示全部楼层
  num_list.remove(each)  # 这个是列表移除啊  不是字符串 你输入的是字符串不是列表所以不会影响
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-8 21:25:20 | 显示全部楼层
num = input('请输入需要计算的数字,用’,‘隔开:')# num是字符串
num_list = num.split(',') #这是分隔字符串
num_list.remove(each) 字符串中没有remove 所有不会影响
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-8 21:26:21 | 显示全部楼层
程序1的错误在于for循环是遍历num_list,而在循环体中又修改num_list,这样会造成遍历时错位。程序2for循环使用了num_list的一个copy就不会出现此问题了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-8 21:28:14 | 显示全部楼层
你输入的都是数字你要是输入英文的话他可能会报错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-8 21:28:20 | 显示全部楼层
因为 num_list 和 num_list[:] 里面的元素虽然一样,但却不是相等的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-8 21:30:18 | 显示全部楼层
°蓝鲤歌蓝 发表于 2018-2-8 21:28
因为 num_list 和 num_list[:] 里面的元素虽然一样,但却不是相等的。

这里的不相等是指内存地址不一样。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-8 23:13:57 From FishC Mobile | 显示全部楼层
老鱼的视频得认真看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-9 19:41:01 | 显示全部楼层
南城顾她 发表于 2018-2-8 21:25
num = input('请输入需要计算的数字,用’,‘隔开:')# num是字符串
num_list = num.split(',') #这是分隔 ...
  1. >>> num = '12,54,dsf,432,sd3,54,fs,34'
  2. >>> num_list = num.split(',')
  3. >>> type(num_list)
  4. <class 'list'>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-9 19:42:19 | 显示全部楼层
冬雪雪冬 发表于 2018-2-8 21:26
程序1的错误在于for循环是遍历num_list,而在循环体中又修改num_list,这样会造成遍历时错位。程序2for循环 ...

我知道程序1是错的,但是为什么程序1运行之后num_list被改变了呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-9 19:43:28 | 显示全部楼层
°蓝鲤歌蓝 发表于 2018-2-8 21:30
这里的不相等是指内存地址不一样。

我知道这个,也许是我问的不够明白,我奇怪的是以程序1的错误方法运行为什么num_list的值最后改变了呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-9 19:44:45 | 显示全部楼层
waitforlove 发表于 2018-2-8 23:13
老鱼的视频得认真看

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

使用道具 举报

发表于 2018-2-9 19:50:58 | 显示全部楼层
纸人无敌 发表于 2018-2-9 19:42
我知道程序1是错的,但是为什么程序1运行之后num_list被改变了呢

因为程序里面使用remove() 方法的是 num_list ,而不是 num_list[:],
所以两个程序里 num_list 都改变了而且元素相等。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-9 19:53:21 | 显示全部楼层
额,,,,其实我想表达的是为什么加不加[:],num_list的结果都一样而new_list的结果却不一样,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-9 20:03:22 | 显示全部楼层    本楼为最佳答案   
纸人无敌 发表于 2018-2-9 19:53
额,,,,其实我想表达的是为什么加不加[:],num_list的结果都一样而new_list的结果却不一样,

1.因为程序里面使用remove() 方法的是 num_list ,而不是 num_list[:],
所以两个程序里 num_list 都改变了而且元素相等。
2.new_list不一样是因为第一个程序是对num_list进行循环,而num_list是在改变的;
而第二个程序是对num_list[:]进行循环,而num_list[:]并未改变。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-9 21:25:40 From FishC Mobile | 显示全部楼层
纸人无敌 发表于 2018-2-9 19:44
比如?

切片之后返回的是一个新数据,你改变原来的,不会影响切片得到的数据
老鱼视频讲列表元组字符串有说到
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-9 21:36:13 From FishC Mobile | 显示全部楼层
纸人无敌 发表于 2018-2-9 19:44
比如?

a=[1,2,3,4,5,6 ]
b=a   改变b。a 也会改变
a[:]切片。切取整个列表a,并返回新的列表。    冒号两边加参数是给出切片范围
c=a[:].  改变a不影响c。改变 c 也不影响a
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-10 17:09:53 | 显示全部楼层
waitforlove 发表于 2018-2-9 21:36
a=[1,2,3,4,5,6 ]
b=a   改变b。a 也会改变
a[:]切片。切取整个列表a,并返回新的列表。    冒号两边加 ...

然而我问的不是这个问题,不过也谢谢你了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-10 17:12:50 | 显示全部楼层
°蓝鲤歌蓝 发表于 2018-2-9 20:03
1.因为程序里面使用remove() 方法的是 num_list ,而不是 num_list[:],
所以两个程序里 num_list 都改变 ...

我好像有点明白了,第一个程序是在num_list改变之后,for 又在新的num_list的基础上重新开始进行遍历的,对吧?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-10 17:24:48 | 显示全部楼层
纸人无敌 发表于 2018-2-10 17:12
我好像有点明白了,第一个程序是在num_list改变之后,for 又在新的num_list的基础上重新开始进行遍历的, ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-7 14:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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