为什么这个for循环没有效果?(Python)

2024-10-06 09:08:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个变量,包含一个城市,或城市加标点符号,然后邮政编码。我正在使用语句删除标点(和其他杂散)字符。看起来像这样:

for c in "!@#%&*()[]{}/?<>,.":
    jobLocationCleaned = string.replace(jobLocationUnclean, c, "")
jobLocation = jobLocationCleaned

# Add to list
params.append(jobLocation)
print(jobLocation)

但是,当使用Debug时,我可以看到代码逐步执行并完成它应该做的工作,但是当它涉及到print语句时,它会在清除之前打印地址,即for循环没有任何效果。在

为什么会这样?在


Tags: inaddforstring语句字符replace邮政编码
3条回答

您应该为此使用regex

>>> import re
>>> from string import punctuation as punc
>>> strs = "Abc*@ddf%^sad#"
>>> re.sub(r'[{}]'.format(punc),'',strs)
'Abcddfsad'

修复代码:

^{pr2}$

为什么你的代码失败了?在

在您的代码中,您循环使用这些标点,并指定 将jobLocationUnclean的值替换为jobLocationCleaned,不过请注意 字符串在python中是不可变的,因此replace(jobLocationUnclean, c, "") 操作根本不会更改原始的jobLocationUnclean。因此,在每次迭代中,您都会替换一个给定的标点符号,并将新字符串赋给jobLocationCleaned。 对字符串的任何操作都会返回一个新字符串。在

>>> strs = "foo"
>>> strs.replace('f','i')
'ioo'
>>> strs  #original foo is still un-changed
'foo'

最后,代码实际上只替换了字符串(jobLocationUnclean)中的.字符,并将其赋给jobLocationCleaned。在

在每次迭代中,您对jobLocationUnclean执行替换,但将结果赋给jobLocationClean。由于每次迭代都使用相同的不干净的起点,因此只有最后一次迭代才会对结果产生任何影响。尝试将代码更改为以下内容:

jobLocation = jobLocationUnclean
for c in "!@#%&*()[]{}/?<>,.":
    jobLocation = jobLocation.replace(c, "")

params.append(jobLocation)
print(jobLocation)

注意,我还做了另外两个小的修改,我只使用了jobLocation并去掉了{},因为这是不必要的,而不是{},我使用了jobLocation.replace(c, "")。这是直接在对象上而不是从字符串模块调用字符串函数的推荐方法。在

在循环中,您永远不会使用上一次迭代的结果,而是使用原始字符串。这是你问题的根源。在

相关问题 更多 >