|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
我本质想明白的问题是,当我们对一个序列使用for循环,并返回序列中的每一个元素时,如果在第一次循环的时候就把序列后面的元素删了,那么这些被删除的元素还会被for循环到吗?
于是有了下面两种操作。
- >>> a = [1,2,3,4,5,6]
- >>> for i in a:
- print(a)
- a.pop()
-
- [1, 2, 3, 4, 5, 6]
- 6
- [1, 2, 3, 4, 5]
- 5
- [1, 2, 3, 4]
- 4
- >>> a
- [1, 2, 3]
复制代码
- >>> b = '12345666'
- >>> for i in b:
- print(i)
- b = b.replace('6','')
- print(b)
-
- 1
- 12345
- 2
- 12345
- 3
- 12345
- 4
- 12345
- 5
- 12345
- 6
- 12345
- 6
- 12345
- 6
- 12345
复制代码
从以上两种代码运行的结果可见,第一种对列表a修改的方法成功反馈到了for循环上,是for循环成功由原来的6次改为了3次。而第二种对字符串b的修改方法却并没有成功反馈到for循环上,结果可见
第一次循环时b字符串已经修改成功了,单数由后面的结果可见,参与循环的字符串b还是原来的那个,求问大佬原因!
经过对两种方法的试验,我发现pop()方法是对列表本身的修改,即列表被pop修改后本身发生了改变;而字符串的replace()方法却不是,这个方法是返回一个新的修改后字符串,原字符串并没有发生
改变,只能由赋值将新字符串赋值给原字符串的变量来实现近似对原字符串的修改,本质还是有新旧两个字符串,只不过旧字符串没有变量指向它了而已,它并没有被修改,所以for循环依旧循环的是旧字符串。这样理解对吗?求大佬解惑!!
- a = [1,2,3,4,5,6]
- def my_iter(l):
- try:
- i = 0
- while 1:
- yield l[i]
- i += 1
- except IndexError:
- pass
- for i in my_iter(a):
- print(a)
- print(a.pop())
- print(a)
复制代码
for是这个原理 实际上直接for in iter(a)
两个iter虽然互不影响,但是都被原列表影响
- a = [1,2,3,4,5,6]
- b = iter(a)
- c = iter(a)
- for i in b:
- print(a)
- print(a.pop())
- for i in c:
- print(a)
- print(a.pop())
-
-
- print(a)
复制代码
|
|