Python str.replace如何工作?

Python str.replace如何工作?,python,string,replace,Python,String,Replace,我有一个概念性的问题。我试图去掉字符串中的标点符号,因此编写了以下函数: 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, " ") re

我有一个概念性的问题。我试图去掉字符串中的标点符号,因此编写了以下函数:

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
有关吗?

因为字符串是不可变的,
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

由于字符串是不可变的,
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

替换不会更改
str
持有的值。这是你的
=
作业完成的

在第一种情况下,所有替换加起来,因为每个带有不同标点符号的调用都会替换上一次替换所产生的字符串中的内容


在第二种情况下,所有替换都会丢失,因为每次使用新标点符号的调用都会替换(不变)原始字符串中的内容,并且只返回最后一次替换(即用空格替换平铺)。

替换不会更改
str
持有的值。这是你的
=
作业完成的

在第一种情况下,所有替换加起来,因为每个带有不同标点符号的调用都会替换上一次替换所产生的字符串中的内容


在第二种情况下,所有替换都会丢失,因为每次使用新标点符号的调用都会替换(不变)原始字符串中的内容,并且只返回最后一次替换(即用空格替换波浪形)。

好好想想——当您循环到第二个
x
时,什么是
str
?(另外,不要使用
str
作为您自己的变量名。)旁白:不要将您的变量命名为
str
,因为这会影响Python的
str
,可能会让代码的读者感到困惑。您的困惑并不是关于
replace
的本质。相反,它是关于Python中assignment的本质。阅读Ned Batchelder的文章,你会更好地理解Python。或者,你可以这样做:
re.sub('[%s]'%string.percentration',,s)
。好好想想——当你循环到第二个
x
,什么是
str
?(另外,不要使用
str
作为您自己的变量名。)旁白:不要将您的变量命名为
str
,因为这会影响Python的
str
,可能会让代码的读者感到困惑。您的困惑并不是关于
replace
的本质。相反,它是关于Python中assignment的本质。阅读Ned Batchelder的文章,你会更好地理解Python。或者,你可以这样做:
re.sub('[%s]'%string.percentration',,s)