python-可变迭代对象在for循环中的风险Risk in FOR loop while looping mutable iterable object

>>> a = [1,2,3,4,5,6]
>>> for item in a:
...     a.remove(item)
...
>>> a
[2, 4, 6]

  

  看到上面的代码是不是感觉很奇怪?直观来看,我们只是想依次把队列a中的每个元素依次删除,为什么最后的结果确是[2,4,6]?如果你够机智想必应该猜出来是什么原因了。对于每一次for循环,当前一次的a.remove(item)执行完成后,a相对的缩短了;item后面的元素补上了之前删除的位置,导致这次for循环删除的是下下个元素。可见,如果我们的迭代对象是会在循环体中发生变化的话,使用for语句将会带来不可预知的风险。

>>> a = [1,2,3,4,5,6]
>>> for item in a:
...     print(‘Index: ‘, a.index(item), ‘ Content:‘, item)
...     a.remove(item)
...
Index:  0  Content: 1
Index:  1  Content: 3
Index:  2  Content: 5
>>> a
[2, 4, 6]
时间: 2024-10-07 12:03:43

python-可变迭代对象在for循环中的风险Risk in FOR loop while looping mutable iterable object的相关文章

第八章 Python可迭代对象、迭代器和生成器

8.1 可迭代对象(Iterable) 大部分对象都是可迭代,只要实现了__iter__方法的对象就是可迭代的. __iter__方法会返回迭代器(iterator)本身,例如: >>> lst = [1,2,3] >>> lst.__iter__() <listiterator object at 0x7f97c549aa50> Python提供一些语句和关键字用于访问可迭代对象的元素,比如for循环.列表解析.逻辑操作符等. 判断一个对象是否是可迭代对象

Python可迭代对象中的添加和删除(add,append,pop,remove,insert)

list: classmates = ['Michael', 'Bob', 'Tracy'] classmates.append('Adam') //添加在末尾,没有add()方法 classmates.insert(1, 'Jack') //在指定位置添加 classmates.pop(1) //在知道位置删除,参数是索引 del classmate[1] //删除第二个元素 classmates.remove('Bob') //参数是元素,删除第一个与Bob值匹配的元素,之后又相同元素不会删

python之迭代

如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration). 在Python中,迭代是通过for ... in来完成的,而很多语言比如C或者Java,迭代list是通过下标完成的,比如Java代码: for (i=0; i<list.length; i++) { n = list[i]; } 可以看出,Python的for循环抽象程度要高于Java的for循环,因为Python的for循环不仅可以用在list或tuple上,

第28天python学习迭代和递归

迭代:就好比问路:A问B,B知道C知道,叫A自己去找B. 递归:就好比问路:A问B,B帮忙问C,C帮忙问D.最后D知道了在返回回去 迭代器协议: 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 满足迭代器协议: a.内部要有next方法:b.内部有iter()方法 2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法) 3.协议是一种约定,

一起学python 三 --字符串详解,for循环

1.整型 n = 56 print(n.bit_length()) #查看值用几位(bit) # python2 中有长整型 long # python3 中全都是整型 2.bool True False print(boll(num)) #非0数字输出Ture 数字0输出False 所有空的都是False 0,None,[],{},(),"" print(int(True)) 1 print(int( False)) 0 ## 字符串转布尔值的时候,只要不为空就是Ture3.字符串详

Python中的可迭代对象与迭代器对象

刚刚学习Python,对“可迭代对象”和"迭代器对象"的个人理解,不知道对不对. 1.几个概念 1.迭代工具:包括for循环.列表解析.in成员关系测试.....等等在内的,用于依次访问可迭代对象(容器)内元素的操作(?). 2.迭代器对象:具有__next__()方法的对象.该方法能够自动返回下一个结果,当到达序列结尾时,引发StopIteration异常. 3.可迭代对象:具有__iter__()方法的对象.该方法可获取其迭代器对象. 2.迭代过程(以for循环为例) for循环开

【python cookbook】【数据结构与算法】2 从任意长度的可迭代对象中分解元素

从某个可迭代对象中分解出N个元素,但是可迭代对象的长度可能超过N,会出现“分解值过多”的异常: 使用“*表达式”来解决该问题: Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32 Type "copyright", "credits" or "license()" for more information. &

(一)Python入门-4控制语句:06for循环结构-遍历各种可迭代对象-range对象

一:for循环和可迭代对象遍历 for 循环通常用于可迭代对象的遍历.for 循环的语法格式如下: for 变量 in 可迭代对象: 循环体语句 可迭代对象: Python包含以下几种可迭代对象: 1. 序列.包含:字符串.列表.元组 2. 字典 3. 迭代器对象(iterator) 4. 生成器函数(generator) 5. 文件对象 [操作] 1 #测试for循环 2 for x in (20,30,40): #元组 3 print(x*2) 4 5 for x in 'abcdefg':

搞懂python中的可迭代对象和迭代器对象(即迭代器)

可迭代的对象和迭代器解惑: 可迭代的对象:常见的可以被for循环迭代的一些数据类型都是可迭代的对象,如列表,元组,字典,集合,字符串,生成器,range函数生成的数列等,从广泛的意义上来说,这些对象都有一个内置的iter方法,且该方法可以返回一个迭代器对象,当用iter(可迭代对象)调用这个对象时,会返回一个迭代器对象(属于Iterator类) for语句的原理就是先用iter函数获取可迭代对象的迭代器,然后调用next函数,此函数自动调用迭代器对象的next方法,每次遍历都返回相应的值,如果没