我不得不迁移到Python,将代码集成到一些现有的Python代码中。我忽略或似乎不存在的一件事是能够对对象本身执行替换。
例如,我会做的一件常见事情是这样的:
textstring = "I am the walrus"
textstring.gsub!(/am/,"was")
然后使文本字符串本身成为全局替换的对象,而不是:
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 模块执行此操作的方法。但我确定我只是忽略了一些东西。
这在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