虚心请教各位大佬
大佬,请教你几个问题!为什么这个方法不行呢?x=
y=
for i in x:
if i in y:
x[:].remove(i)
print(x[:])
还有就是在x[]不变的情况下,为什么每次id(x[:])的值都不一样呢? 本帖最后由 小伤口 于 2021-3-22 09:23 编辑
别用列表在for循环中进行移出增加,
如果要的话这样for i in x[:]: id() 函数返回对象的唯一标识符,标识符是一个整数。
CPython 中 id() 函数用于获取对象的内存地址。
内存地址当然每次运行都会重新分配咯, 当然你也可以用破解的思路去找基地址{:10_274:} 本帖最后由 jackz007 于 2021-3-22 10:10 编辑
x[:] 代表 x 的副本,每次都是临时的,就是说,每写一次 x[:] 就会临时产生一个副本,所以,每次都不一样。如果想在 x[:] 上进行操作,必须通过赋值,先把 x[:] 固定住,然后再操作就可以了。
x=
y=
z = x[:]
for i in x:
if i in y:
z . remove(i)
print(z)
jackz007 发表于 2021-3-22 10:08
x[:] 代表 x 的副本,每次都是临时的,就是说,每写一次 x[:] 就会临时产生一个副本,所以,每次都不 ...
学习了{:10_254:} 你的每次 x[:] 的 id 都是不一样的
x[:] 是原列表 x 的副本,相当于复制件
你无论在 副本 中作任何样式的修改,对原列表有什么影响呢?
所以原列表并没有任何变化,当然原列表的新副本也不会有变化咯
而如果你将代码改成
x=
y=
for i in x[:]:
if i in y:
x.remove(i)
print(x,x[:])
那就不一样了,以副本循环,在原列表操作
事实上也确实应该是我给你的修改后的代码正确 感谢几位大佬!!!!!! 先回答第2个问题:
x[:]是列表切片,切片的工作原理,是将列表中的片段(自起始索引始和终点索引止),拷贝后生成新列表
x =
a = x # 普通赋值
b = x[:]
c = x[:]
id(x)
id(a)
id(b)
id(c)# 可以看出,a和x是同一个列表,b和c已经是2个列表了,因为每切片操作一次,就生成了一个新列表,尽管内容完全一样
---2--->
所以你代码中其实有2个问题
for … in …循环中,直接对列表操作,索引是持续进行的,会存在跳过元素的情况
例如,把你的循环段代码修改如下:
a = x[:]
for i in a:
if i in y:
a.remove(i)
print(a)
你会发现程序过程如下:
第1次循环,
i = 1,if判断为真,执行a.remove(1)
第2次循环,索引第2个元素,因为列表已经删除了第1个元素,此时第2个元素是3
i = 3,if判断为真,执行a.remove(3)
因此,想实现你的思路,代码最好这样写,也就是复制新列表,移除元素在复制的新列表中执行:
x =
y =
a = x[:]
for i in x:
if i in y:
a.remove(i)
print(a)
笨鸟学飞 发表于 2021-3-22 10:36
先回答第2个问题:
x[:]是列表切片,切片的工作原理,是将列表中的片段(自起始索引始和终点索引止),拷 ...
感谢大佬,跳过倒是明白,就是切片复制这有点问题,现在明白了每次x[:]都是一个新的列表
页:
[1]