Python:调用一个对象的方法,什么时候会改变对象,什么时候不会?

时间:2016-10-29 15:19:59

标签: python function methods

我是python中的新手,我发现了一些奇怪的东西:

>>> test="acdefg"
>>> test.replace('a','h')
'hcdefg'
>>> test
'acdefg'
>>> test=[1,2,3]
>>> test.reverse()
>>> test
[3, 2, 1]

正如您在代码中看到的,第一次,变量" test"是一个字符串,当我调用方法"替换"," test"的值。不会改变,第二次是一个列表,并且在我调用方法reverse()后列表发生了变化。

为什么?是因为方法之间存在某些不同之处,还是因为对象之间存在其他不同之处?

2 个答案:

答案 0 :(得分:1)

这完全取决于方法的实现。有些方法会修改它们要调用的对象,有些则不会。

答案 1 :(得分:1)

字符串是不可变的。所以你实际上并没有改变test。您实际上正在获取return字符串方法的replace。要使用此修改后的字符串,您必须创建一个新字符串,或者只是用新值替换现有字符串。

>>> some_string = "abcd"
>>> new_string = some_string.replace('a', 'x')
>>> new_string
xbcd
>>> some_string = "abcd"
>>> some_string = some_string.replace('a', 'x')
>>> some_string
xbcd

第二个示例,列表是可变的,并且您正在对列表执行就地操作。如果你真的这样做:

res = your_list.reverse()

res实际上是None,因为它不返回任何内容,它实际上就是这样做的,这就是test列表将保存您执行的新操作的原因。< / p>

阅读Python中不可变vs可变类型的this

另外,请参阅数据模型上的文档here以进一步了解您的理解。