在"for item in…"期间正确删除项目

说你有这样的东西:
对于myList中的项目:
DEL项目
这实际上是从列表中删除项目还是只是减少
参考计数器,因为mylist中的项目与
使用名称" item"了(但仍然与myList [itemIndex]一起使用)?在
其他单词是"项目"临时引用[myList [itemIndex]或
MyList存储的实际上是该引用吗?
我不确定这个问题是否已经有意义了.我去过
使用Python多年了,从来没有任何问题(我现在没有
也是),但是现在我不得不重新访问C ++/STL,我不得不处理
这些问题,想知道Python是如何做到的.
谢谢,
Ratko

# 回答1


拉特科(Ratko)在2008年7月17日在THU,2008年7月27:27 -0700写道:
后者.名称始终与对象绑定,您不能将名称绑定到
Python中的另一个名称或参考.
再见,
marc'blackjack'rintsch
# 回答2


拉特科写道:
" del"语句不会删除对象,它删除了
一个东西.在这种情况下,变量项目将从范围中删除,
并且引用到对象将其参考计数器减少
到1.(但是,当您猜测而不是零,因为列表仍将
引用它.)
您可以使用
del mylist [i]
如果你知道我.但是,在循环浏览列表时不要这样做!
更改列表的长度将与for循环的相互作用差异很差
在列表中进行索引,导致循环误解元素以下
删除的项目.
加里·赫伦
# 回答3


加里·赫伦(Gary Herron)写道:
跳入线程,我知道该怎么做,而不是如何做
适当地?
通过副本进行迭代可能会_ Propbility_工作:
del t [t.index(el)]
[]
但是,真的安全吗?将安全定义为"在每一个中可靠地工作
每种可索引数据类型的转角案例"?
CON:假设数据结构T确实非常大.只是删除
来自T的某些项目暂时使内存消耗翻倍.
# 回答4


在7月17日上午9:57,MK 跳入线程,我知道该怎么做,而不是如何做
适当地?
通过副本进行迭代可能会_ Propbility_工作:
del t [t.index(el)]
[]
但是,真的安全吗?将安全定义为"在每一个中可靠地工作
每种可索引数据类型的转角案例"?
CON:假设数据结构T确实非常大.只是删除
来自T的某些项目暂时使内存消耗翻倍.

那么(安全)会工作吗?在我的测试案例中确实如此
当然没有证明它在一般情况下起作用...
对于myList中的项目:
mylist.remove(项目)
对于字典,我们只能迭代值()或item()为
与itervalues()或iteritems()相反,因为从技术上讲这是一个副本
dict中的价值或项目,对吗?
r

# 回答5


Mk del t [t.index(el)]
[]
但是,真的安全吗?将安全定义为"在每一个中可靠地工作
每种可索引数据类型的转角案例"?
没有为什么 您不一定使用使用的每个可索引数据类型
t [:],并非所有类型都会支持索引.也效率低下
从列表的开头删除.
如果您正在使用列表并删除每个对象:
del t [:]
就足够了.
如果您不想删除所有内容,那么您可以做:
对于索引,枚举(反向(t))中的el:
如果不是Wewant(El):
del t [索引]
但是Pythonic方法只是:
t [:] = [如果wewant(el)在t中的El]
或者,如果您只想要过滤列表,并且不在乎更新
原来的:
t = [如果wewant(el)在t中的el for El]
不,不是.复制列表不会复制列表中的任何元素,
它只是复制了对这些元素的引用.
# 回答6


拉特科写道:
跳入线程,我知道如何不这样做,而不是如何做到这一点?在副本上迭代可能会_propable_工作:
del t [t.index(el)]
[]但是,真的很安全吗?将安全定义为"在每种可索引数据类型的每个corner案例中可靠地工作"?con:假设数据结构T确实非常大.只需从t删除t临时将内存消耗加倍即可.
那么(安全)会工作吗?在我的测试案例中确实如此
当然没有证明它在一般情况下起作用...
对于myList中的项目:
mylist.remove(项目)
否.
并增加内部索引.列表的任何修改都可以
不要相应地更改索引.
一种适当的方法:
newList = []
对于myList中的项目:
如果...无论如何...
newlist.append(项目)
myList = newList
另一个,使用列表理解(实际上与上述相同):
myList = [MyList中的项目,如果...任何...]
不!实际上,迭代和iTervalues和iterkeys的重点是
他们 *不 *制作副本,因此从中更改字典
在它们下是一个编程错误.
如果您使用dict.items(),dict.keys()或dict.values(),那么您还可以,
因为这些方法 *确实 *为两者创建新列表.
加里·赫伦
# 回答7


对于字典,我们只能迭代值()或item()为
不!实际上,迭代和iTervalues和iterkeys的重点是
他们 *不 *制作副本,因此从中更改字典
在它们下是一个编程错误.
如果您使用dict.items(),dict.keys()或dict.values(),那么您还可以,
因为这些方法 *确实 *为两者创建新列表.

这就是我的意思,我猜这只是没有正确遇到.
感谢您澄清这些问题.我想我有更好
现在了解.
r

# 回答8


删除时向后走清单.
master = ['a','b','c','d','e','f','g']
打印"无删除"
a = master [:]
打印
因为我在一个:
熟食店
打印
打印
打印
打印"从端安全地删除"
a = master [:]
打印
对于我的范围(len(a)-1,-1,-1):
打印i
如果我%2 == 0:
打印"删除",主人[i]
del a [i]
打印"",a,
如果在A中[i]
打印"糟糕,删除错误的东西...",
打印
普林 t a 打印 打印 打印"从前面删除.删除错误的东西并抛出 例外..." a = master [:] 打印 #for i在范围内(len(a)-1,-1,-1): 对于我的范围(len(a)): 打印i 如果我%2 == 0: 打印"删除",主人[i] del a [i] 打印"",a, 如果在A中[i] 打印"糟糕,删除错误的东西...", 打印 打印一个

标签: python

添加新评论