有没有Python相当于Ruby的自我(!)?

时间:2018-03-22 15:03:56

标签: python

我不得不转向Python将代码集成到现有的Python代码中。我忽略或者似乎不存在的事情之一是能够在对象本身上执行替换。

例如,我会做的一件好事就是这样:

textstring = "I am the walrus"
textstring.gsub!(/am/,"was")

然后使texttring本身成为全局替换的对象,而不是:

newtextstring = textstring.gsub(/am/,"was")


2.4.0 :005 > textstring = "I am the walrus"
 => "I am the walrus" 
2.4.0 :005 > newtextstring = textstring.gsub(/am/,"was")
 => "I was the walrus" 
2.4.0 :006 > puts textstring
I am the walrus
 => nil 
2.4.0 :007 > puts newtextstring
I was the walrus

我还没有找到使用Python re模块执行此操作的方法。但我确信我只是忽略了一些东西。

1 个答案:

答案 0 :(得分:6)

这在Python中是不可能的,因为与Ruby相反,字符串是不可变的。

一般来说,如果一个对象有改变其数据的方法,那么它被认为是可变的。许多内置对象是可变的,并且通过方法调用来调用变异,这不需要Python中的特殊操作符。

示例1:从列表中删除最后一项。

>>> mylist = [1,2,3]
>>> mylist.pop()
3
>>> mylist
[1, 2]

示例2:sorted返回一个新列表,list.sort就地排序列表。

>>> mylist = [5, 4]
>>> sorted(mylist)
[4, 5]
>>> mylist
[5, 4]
>>> mylist.sort()
>>> mylist
[4, 5]

您只需知道哪些功能/方法可以正常工作或阅读文档。

  

可变对象的方法是否就地运行?目前似乎无法想到一个反例。

但是有很多。

>>> mylist.__add__(mylist) # mylist + mylist
[4, 5, 4, 5]
>>> mylist
[4, 5]

# mylist[:] is mylist
>>> mylist.__getitem__(slice(None, None, None)) is mylist
False