鱼C论坛

 找回密码
 立即注册
查看: 2324|回复: 8

[已解决]虚心请教各位大佬

[复制链接]
发表于 2021-3-22 09:09:26 | 显示全部楼层 |阅读模式

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

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

x
大佬,请教你几个问题!
为什么这个方法不行呢?
  1. x=[1,2,3,4,5,6,7,8,9]
  2. y=[1,2,3,4]
  3. for i in x:
  4.     if i in y:
  5.         x[:].remove(i)
  6. print(x[:])
复制代码

还有就是在x[]不变的情况下,为什么每次id(x[:])的值都不一样呢?
最佳答案
2021-3-22 10:08:33
本帖最后由 jackz007 于 2021-3-22 10:10 编辑

      x[:] 代表 x 的副本,每次都是临时的,就是说,每写一次 x[:] 就会临时产生一个副本,所以,每次都不一样。如果想在 x[:] 上进行操作,必须通过赋值,先把 x[:] 固定住,然后再操作就可以了。
  1. x=[1,2,3,4,5,6,7,8,9]
  2. y=[1,2,3,4]
  3. z = x[:]
  4. for i in x:
  5.     if i in y:
  6.         z . remove(i)
  7. print(z)
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-3-22 09:21:43 From FishC Mobile | 显示全部楼层
本帖最后由 小伤口 于 2021-3-22 09:23 编辑

别用列表在for循环中进行移出增加,
如果要的话这样for i in x[:]:
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-22 09:26:21 | 显示全部楼层
id() 函数返回对象的唯一标识符,标识符是一个整数。

CPython 中 id() 函数用于获取对象的内存地址。

内存地址当然每次运行都会重新分配咯, 当然你也可以用破解的思路去找基地址
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-22 10:08:33 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-3-22 10:10 编辑

      x[:] 代表 x 的副本,每次都是临时的,就是说,每写一次 x[:] 就会临时产生一个副本,所以,每次都不一样。如果想在 x[:] 上进行操作,必须通过赋值,先把 x[:] 固定住,然后再操作就可以了。
  1. x=[1,2,3,4,5,6,7,8,9]
  2. y=[1,2,3,4]
  3. z = x[:]
  4. for i in x:
  5.     if i in y:
  6.         z . remove(i)
  7. print(z)
复制代码

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

使用道具 举报

发表于 2021-3-22 10:11:32 From FishC Mobile | 显示全部楼层
jackz007 发表于 2021-3-22 10:08
x[:] 代表 x 的副本,每次都是临时的,就是说,每写一次 x[:] 就会临时产生一个副本,所以,每次都不 ...

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

使用道具 举报

发表于 2021-3-22 10:12:51 | 显示全部楼层
你的每次 x[:] 的 id 都是不一样的
x[:] 是原列表 x 的副本,相当于复制件
你无论在 副本 中作任何样式的修改,对原列表有什么影响呢?
所以原列表并没有任何变化,当然原列表的新副本也不会有变化咯
而如果你将代码改成
  1. x=[1,2,3,4,5,6,7,8,9]
  2. y=[1,2,3,4]
  3. for i in x[:]:
  4.     if i in y:
  5.         x.remove(i)
  6. print(x,x[:])
复制代码

那就不一样了,以副本循环,在原列表操作
事实上也确实应该是我给你的修改后的代码正确
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-22 10:28:18 | 显示全部楼层
感谢几位大佬!!!!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-22 10:36:11 | 显示全部楼层
先回答第2个问题:
x[:]是列表切片,切片的工作原理,是将列表中的片段(自起始索引始和终点索引止),拷贝后生成新列表
x = [1,2,3,4,5,6,7,8,9]
a = x # 普通赋值
b = x[:]
c = x[:]
id(x)
id(a)
id(b)
id(c)  # 可以看出,a和x是同一个列表,b和c已经是2个列表了,因为每切片操作一次,就生成了一个新列表,尽管内容完全一样
---2--->
所以你代码中其实有2个问题
for … in …  循环中,直接对列表操作,索引是持续进行的,会存在跳过元素的情况
例如,把你的循环段代码修改如下:
  1. a = x[:]
  2. for i in a:
  3.         if i in y:
  4.                 a.remove(i)
  5. print(a)
复制代码

你会发现程序过程如下:
第1次循环,
i = 1,if判断为真,执行a.remove(1)
第2次循环,索引第2个元素,因为列表已经删除了第1个元素,此时第2个元素是3
i = 3,  if判断为真,执行a.remove(3)
因此,想实现你的思路,代码最好这样写,也就是复制新列表,移除元素在复制的新列表中执行:
  1. x = [1,2,3,4,5,6,7,8,9]
  2. y = [1,2,3,4]
  3. a = x[:]
  4. for i in x:
  5.     if i in y:
  6.         a.remove(i)
  7. print(a)
复制代码



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

使用道具 举报

 楼主| 发表于 2021-3-22 11:27:37 | 显示全部楼层
笨鸟学飞 发表于 2021-3-22 10:36
先回答第2个问题:
x[:]是列表切片,切片的工作原理,是将列表中的片段(自起始索引始和终点索引止),拷 ...

感谢大佬,跳过倒是明白,就是切片复制这有点问题,现在明白了每次x[:]都是一个新的列表
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-26 08:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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