所以以下是困惑我。
#!/usr/bin/pytn
test = [0, 0, 0, 1, 2, 3, 4, 5, 6]
test1 = [0, 0, 0, 1, 2, 3, 4, 5, 6]
for _dummy in test:
if(_dummy == 0):
test.pop()
for _dummy in test1:
if(_dummy == 0):
test1.pop(0)
print test
print test1
后果
ubuntu-vm:~/sandbox$ ./test.py
[0, 0, 0, 1, 2, 3]
[0, 1, 2, 3, 4, 5, 6]
也许,我从根本上误解了 pop 是如何实现的。但我的理解是,它删除列表中给定索引处的项目,并返回它。如果未指定索引,则默认为最后一个项目。所以似乎在第一个循环中它应该从列表的左侧删除 3 个项目,在第二个循环中它应该从列表的末尾删除 3 个项目。
第一个测试并不奇怪;最后删除了三个元素。
第二次测试有点意外,只去掉了两个元素,为什么?
Pytn 中的列表迭代本质上是将索引递增到列表中。当您删除一个元素时,您会将右侧的所有元素移动。这可能会导致索引指向不同的元素。
说明性地:
start of loop
[0,0,0,1,2,3,4,5,6]
^ <-- position of index
delete first element (since current element = 0)
[0,0,1,2,3,4,5,6]
^
next iteration
[0,0,1,2,3,4,5,6]
^
delete first element (since current element = 0)
[0,1,2,3,4,5,6]
^
从现在开始没有遇到零,所以没有更多的元素被删除。
为了避免将来的混乱,在迭代列表时尽量不要修改它们。虽然 Pytn 不会抱怨(不像字典,在迭代过程中不能修改),但它会导致像这样奇怪且通常违反直觉的情况。
因为在列表中或堆栈在后进先出 [LIFO] 中工作,所以使用pop()
它删除列表中的最后一个元素
其中 aspop(0)
表示它删除索引中的元素,该元素是列表的第一个元素
根据文档
list.pop([i]):
Remove the item at the given position in the list,and return it.If no index is specified,a.pop() removes and returns the last item in the list.(The square brackets around the i in the metd signature denote that the parameter is optional,not that you suld type square brackets at that position.You will see this notation frequently in the Pytn Library Reference.)
如果您查看第一个元素,删除它,然后继续查看第二个元素,那么您就错过了一个元素。
最初位于第二位的元素从未被检查过,因为它在迭代过程中“改变了位置”。
当您在 pytn 中使用 'for item in ITEMS:
' 命令时;您仍然按索引迭代,item 仍然隐式设置为item = ITEMS[index]
。每个 pop(0)将项目向左移动,下一个item被引用为item = ITEMS[index++]
,因此,test1 中的第三个零永远不会被循环处理。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(3条)