我有一个概念性的问题。我试图摆脱字符串中的标点符号,所以我编写了以下函数:
def nopunc(str):
for x in string.punctuation:
str = str.replace(x, " ")
return str
这很有用。但是,当我稍微改变一下这个功能时:
def nopunc(str):
for x in string.punctuation:
str1 = str.replace(x, " ")
return str1
它不起作用。我给了字符串一个名为str = str.replace(x, "")
的新名称,而不是str1
。为什么会导致问题?它与.replace
有关吗?
答案 0 :(得分:4)
由于字符串是不可变的,str.replace(x, " ")
不以任何方式修改str
引用的字符串对象。相反,如果x
替换为" "
,则会返回此对象的副本。
在第一个for循环中,每次迭代都会将此新创建的对象分配给现有名称str
。所以,你的第一个功能基本上等同于:
def nopunc(str):
str = str.replace(string.punctuation[0], " ")
str = str.replace(string.punctuation[1], " ")
str = str.replace(string.punctuation[2], " ")
...
str = str.replace(string.punctuation[31], " ")
return str
请注意名称str
的值如何不断更新,从而保存所有更改。
第二个for循环只是重复地将名称str1
重新分配给str.replace(x, " ")
。这意味着你的第二个功能与做:
def nopunc(str):
str1 = str.replace(string.punctuation[31], " ")
return str1
答案 1 :(得分:2)
替换不会更改str
所持有的值。这是您的=
作业。
在第一种情况下,所有替换都会加起来,因为每个带有不同标点符号的调用都会替换先前替换后的字符串中的内容。
在第二种情况下,所有替换都会丢失,因为每个带有新标点符号的调用都会替换(不变)原始字符串中的内容,并且只返回最后一个替换(用空格替换波浪号)。