鱼C论坛

 找回密码
 立即注册
查看: 1767|回复: 1

[已解决]大佬们,这两个操作的区别是什么?运行结果不一样是因为pop()是对列表本身的修改吗?

[复制链接]
发表于 2020-11-29 22:29:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我本质想明白的问题是,当我们对一个序列使用for循环,并返回序列中的每一个元素时,如果在第一次循环的时候就把序列后面的元素删了,那么这些被删除的元素还会被for循环到吗?
于是有了下面两种操作。
  1. >>> a = [1,2,3,4,5,6]
  2. >>> for i in a:
  3.         print(a)
  4.         a.pop()

  5.        
  6. [1, 2, 3, 4, 5, 6]
  7. 6
  8. [1, 2, 3, 4, 5]
  9. 5
  10. [1, 2, 3, 4]
  11. 4
  12. >>> a
  13. [1, 2, 3]
复制代码

  1. >>> b = '12345666'
  2. >>> for i in b:
  3.         print(i)
  4.         b = b.replace('6','')
  5.         print(b)

  6.        
  7. 1
  8. 12345
  9. 2
  10. 12345
  11. 3
  12. 12345
  13. 4
  14. 12345
  15. 5
  16. 12345
  17. 6
  18. 12345
  19. 6
  20. 12345
  21. 6
  22. 12345
复制代码


从以上两种代码运行的结果可见,第一种对列表a修改的方法成功反馈到了for循环上,是for循环成功由原来的6次改为了3次。而第二种对字符串b的修改方法却并没有成功反馈到for循环上,结果可见
第一次循环时b字符串已经修改成功了,单数由后面的结果可见,参与循环的字符串b还是原来的那个,求问大佬原因!

经过对两种方法的试验,我发现pop()方法是对列表本身的修改,即列表被pop修改后本身发生了改变;而字符串的replace()方法却不是,这个方法是返回一个新的修改后字符串,原字符串并没有发生
改变,只能由赋值将新字符串赋值给原字符串的变量来实现近似对原字符串的修改,本质还是有新旧两个字符串,只不过旧字符串没有变量指向它了而已,它并没有被修改,所以for循环依旧循环的是旧字符串。这样理解对吗?求大佬解惑!!
最佳答案
2020-11-29 23:51:34
  1. a = [1,2,3,4,5,6]

  2. def my_iter(l):
  3.     try:
  4.         i = 0
  5.         while 1:
  6.             yield l[i]
  7.             i += 1
  8.     except IndexError:
  9.         pass


  10. for i in my_iter(a):
  11.     print(a)
  12.     print(a.pop())

  13. print(a)
复制代码

for是这个原理  实际上直接for in iter(a)
两个iter虽然互不影响,但是都被原列表影响
  1. a = [1,2,3,4,5,6]

  2. b = iter(a)
  3. c = iter(a)

  4. for i in b:
  5.     print(a)
  6.     print(a.pop())


  7. for i in c:
  8.     print(a)
  9.     print(a.pop())
  10.    
  11.    
  12. print(a)
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-29 23:51:34 | 显示全部楼层    本楼为最佳答案   
  1. a = [1,2,3,4,5,6]

  2. def my_iter(l):
  3.     try:
  4.         i = 0
  5.         while 1:
  6.             yield l[i]
  7.             i += 1
  8.     except IndexError:
  9.         pass


  10. for i in my_iter(a):
  11.     print(a)
  12.     print(a.pop())

  13. print(a)
复制代码

for是这个原理  实际上直接for in iter(a)
两个iter虽然互不影响,但是都被原列表影响
  1. a = [1,2,3,4,5,6]

  2. b = iter(a)
  3. c = iter(a)

  4. for i in b:
  5.     print(a)
  6.     print(a.pop())


  7. for i in c:
  8.     print(a)
  9.     print(a.pop())
  10.    
  11.    
  12. print(a)
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 16:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表