Str替换方法就地发生了

时间:2017-06-28 12:11:21

标签: python string qt replace str-replace

我有一个Python字符串,我希望在一个乳胶文件中\include。但是,我的字符串有一个下划线字符(_),在包含之前需要将其转换为\_(这是_的乳胶表示)。

如果我这样做:

self.name = self.laser_comboBox.currentText() #Get name from a qt widget
latex_name = self.name.replace("_", r"\_") #Replacing _ for \_
print self.name
print latex_name

我会得到:

XXXXXX-YY\_SN2017060009
XXXXXX-YY\_SN2017060009

可以看出,两个变量都被替换了。这意味着replace方法发生在原地。但是,如果我这样做:

self.name = self.laser_comboBox.currentText() #Get name from a qt widget
latex_name = str(self.name).replace("_", r"\_") #Converting to str and then replacing _ for \_
print self.name
print latex_name

我会得到:

XXXXXX-YY_SN2017060009
XXXXXX-YY\_SN2017060009

这让我很困惑......我想知道为什么会这样......

2 个答案:

答案 0 :(得分:7)

我在这里进行了一些测试,我想我已经找到了答案。

我的var self.name<class 'PyQt4.QtCore.QString'>类型,因为我是从QtWidget获取的。 有人,如果我错了,请纠正我,但是从我运行的测试和文档(http://doc.qt.io/qt-5/qstring.html#replace)来看,replace中的<class 'PyQt4.QtCore.QString'>方法似乎就位。而对于Python str,它不会,因为python字符串是不可变的。

简而言之:

  • Python strinplace=False(Python字符串是不可变的)
  • PyQt4.QtCore.QStringinplace=True

无论如何,希望这会有所帮助

答案 1 :(得分:0)

执行self.name时,您实际上正在替换对象name字符串。

但是当您执行str(self.name)时,您正在替换由str创建的新对象,而不是self.name。因此self.name保持不变。