马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 折折叠叠像弹簧 于 2020-4-17 10:24 编辑
新手小白求教两个关于迭代问题的疑惑
迭代对象是列表时,迭代过程中删除列表元素可能会使结果出错
示例程序:删除列表中偶数lst = [1,2,4,3,5]
for i in lst:
if item % 2 == 0:
lst.remove(i)
print(lst)
输出:
[1,4,3,5]
我猜测是for循环按索引值遍历,删除数字2时,数字4的索引值自动变为1,不再遍历,不知道对不对
------------------------------------------------------- 分割线 ------------------------------------------------------------
今天遇到了一个新情况:迭代对象是字符串时,迭代过程中把元素删除,却不会使结果出错
示例程序:删除字符串中非字母元素str = '32Cappuccino'
for i in str:
if i.isalpha() == False:
str.replace(i,'')
print(str)
输出
Cappuccino
类推前述列表的情况,此时输出的应该是2Cappuccino,没有出现异常是因为字符串中元素被替换后,索引值还是保留的吗?还是说字符串的迭代机制不同?
代码第4行没有缩进,修改之后运行的结果并非'Cappuccino',而是'32Cappuccino',究其原因是因为replace是返回字符串的副本而不是修改字符串本身。我现在的版本是3.8.1,官方文档是这样的:
str.replace(old, new[, count])
返回字符串的副本,其中出现的所有子字符串 old 都将被替换为 new。 如果给出了可选参数 count,则只替换前 count 次出现。
字符串在python里是 不可修改的对象,所以实际上你无法对字符串对象本身进行任何修改,包括用分片、replace等方式处理的都是副本,那怕你赋值给原始的变量,那也是改变了id的存在,已经不是原始的对象了,所以你对字符串迭代不会受到任何影响。要想出现你说的结果,代码需要修改成这样(我加了id这样可以清晰看到改变): str = '32Cappuccino'
print(id(str))
for i in str:
if i.isalpha() == False:
str=str.replace(i,'') #把结果赋值给str
print(str)
print(id(str))
>>> %Run test22a.py
2693111182320
Cappuccino
2693111184432
可以很明显地看到str的id已经改变了,而迭代则是根据原始的str进行的,不会受到元素被改变的困扰。
|