代码第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进行的,不会受到元素被改变的困扰。