Python 方法:修改原始对象与 return 不同的对象

Python methods: modify original vs return a different object

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

我看到一些方法return修改了一个对象,并保留了原来的:

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]

这些都是常态吗?对于给定的 class 和方法,有没有办法知道我正在处理哪种情况?

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

一般来说,如果一个 class(对象)被描述为不可变的,你应该期待前者的行为,而后者则是可变对象。

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

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

在 Python 中不常见的是改变一个对象,然后 return 改变一个对象,然后 return 同一个对象 - 这将允许像这样将方法链接在一起:

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

...但会导致程序更难调试。

如果一个对象是不可变的,比如一个字符串,您可以确定方法不会改变它(因为根据定义,它不能)。如果做不到这一点,判断一个方法是否改变其对象的唯一方法是阅读文档(通常对 Python 的内置和标准库对象非常有用),或者当然是源代码。