Str 替换方法就地发生

Str replace method happening inplace

我有一个 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

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

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

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

所以,简而言之:

  • Python str: inplace=False (Python 字符串是不可变的)
  • PyQt4.QtCore.QString: inplace=True

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

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

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