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 的内置和标准库对象非常有用),或者当然是源代码。
我是 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 的内置和标准库对象非常有用),或者当然是源代码。