Python方法:修改原始vs返回不同的对象

时间:2016-11-21 01:34:08

标签: python functional-programming immutability conventions mutable

我是Python和面向对象编程的新手,并且有一个非常基本的101问题:

我看到一些方法返回一个修改过的对象,并保留原始文件:

In: x="hello"
In: x.upper()
Out: 'HELLO'
In: x
Out: 'hello'

我看到其他方法修改并覆盖原始对象:

In: y=[1,2,3]
In: y.pop(0)
Out: 1
In: y
Out: [2, 3]

这些都是常态吗?有没有办法知道我在处理给定的类和方法的情况?

2 个答案:

答案 0 :(得分:3)

您的示例显示了不可变内置对象(例如,字符串和元组)与可变对象(例如,列表,字符串和集合)之间的区别。

通常,如果一个类(对象)被描述为不可变的,你应该期望前者的行为,后者是可变的对象。

答案 1 :(得分:2)

这两个都是Python中的惯用语,尽管list.pop()是一个稍微特殊的情况。

通常,Python 中的方法变异对象返回一个值。 list.pop()有点不寻常,根据定义,它必须同时执行这两项操作:从列表中删除项目,然后将其返回给您。

Python中不常见的是,虽然它在其他语言中,但是要改变一个对象,然后返回同一个对象 - 这样就可以将方法链接在一起,如下所示:

shape.stretch(x=2).move(3, 5)

...但可能导致程序更难调试。

如果一个对象是不可变的,就像一个字符串,你可以确定一个方法不会改变它(因为,根据定义,它不能)。如果不这样做,判断方法是否会改变其对象的唯一方法是阅读文档(通常对Python的内置和标准库对象来说非常好),当然还有源代码。