如:
char c = 'A'; char *p = &c;
我们手上只有一个 p,要怎么修改 *p 的内容呢?毫无疑问,我们没有办法。而这就正是
python 里的现实情况。char 就是属于 immutable 的类型,我们再举一个 C++ 的例子:
class foo {
char m_c; public:
foo () : m_c('A') {} void set (char c) { m_c = c;
}
char get () {
return m_c;
}
};
foo *p = new foo();
std::cout << "foo: " << p->get() << std::endl; p->set('B');
std::cout << "foo: " << p->get() << std::endl;
在上面这个例子里,如果说我们仍然没有对指针的 * 运算,但我们依然可以改变 *p 的内容,这是因为 p 所指向的对象,具有修改自身的能力(提供了相关的方法)。这种类型, 在 python 里面,就是 mutable 的。我们常见的 list,dict 等等,就属于此类。而 python 的字符串类,则属于 immutable 的。
这里有两个地方需要注意:
- 变量赋值,实际上并没有产生对象的拷贝,仅仅是 “引用” (指针) 的拷贝。比如:
d1 = {'1' : 1, '2' : 2, }
d2 = d1 d2['3'] = 3
for k in d1:
print k, ' => ', d1[k]
上面的代码,我们会发现,d1['3'] 也存在了,而且值就是 3。所以我们可以把 python 里面的所有变量都想象成指针;所有的变量对变量的 = 操作都想象成指针的赋值,所有的 . 操作都想象成 ->,那么则庶几不会有问题了。