我是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]
这些都是常态吗?有没有办法知道我在处理给定的类和方法的情况?
答案 0 :(得分:3)
您的示例显示了不可变内置对象(例如,字符串和元组)与可变对象(例如,列表,字符串和集合)之间的区别。
通常,如果一个类(对象)被描述为不可变的,你应该期望前者的行为,后者是可变的对象。
答案 1 :(得分:2)
这两个都是Python中的惯用语,尽管list.pop()
是一个稍微特殊的情况。
通常,Python 中的方法变异对象或返回一个值。 list.pop()
有点不寻常,根据定义,它必须同时执行这两项操作:从列表中删除项目,然后将其返回给您。
Python中不常见的是,虽然它在其他语言中,但是要改变一个对象,然后返回同一个对象 - 这样就可以将方法链接在一起,如下所示:
shape.stretch(x=2).move(3, 5)
...但可能导致程序更难调试。
如果一个对象是不可变的,就像一个字符串,你可以确定一个方法不会改变它(因为,根据定义,它不能)。如果不这样做,判断方法是否会改变其对象的唯一方法是阅读文档(通常对Python的内置和标准库对象来说非常好),当然还有源代码。