(翻译)为什么Python的字符串是不可变对象


类型:Python,创建时间:Jan. 1, 2012, 4:50 p.m.

标题无“转载”即原创文章,版权所有。转载请注明来源:http://hgoldfish.com/blogs/article/61/。

翻译自http://effbot.org/pyfaq/why-are-python-strings-immutable.htm

不可变对象是指一旦生成后不能被改变的对象。他经常与可变对象相提并论。比如Python的tuplelist,它们的行为有点类似。但是可以list对象内添加新的元素。而tuple则不可以。Python的字符串被设计成不可变对象有几个优点。

首先,可以提高性能。假定字符串是不可变对象,意味着字符串具有确定而不可变的存储需求,解释器可以为它分配一段固定的内存。这也是为什么要分为tuplelist两种类型的原因之一。让字符串成为不可变对象还可以让解释器重用该对象。比如,CPython在实现中预先申请了所有的单字节节符,并且,如果字符串运算后的结果与运算前相同,就会返回运算前的字符串(*)。

另外,在Python里,字符串就像数字一样,被认为是表示思想的最基本的材料。在Python里,没有任何方法可以把数字8变成其它东西,同样,也没有办法把"eight"这个字符串变成其它东西。

另外,使用不可变数据结构(immutable data structures),比如字符串,元组,强调了一种无副作用的编程方式。采用这种编程方式所编写的函数接收输入的参数,进行运算,然后返回一个容纳结果的新对象。而不是修改输入的参数,使它变成运算结果。当然了,有时候必须做一些有副作用的操作,比如修改对象的状态。这种事最好仔细考虑一番,因为无副作用的编程哲学能够让你的代码更加模块化,使其独立于其它代码。

译者(就是老鱼啦)注:

(*) 可以参考以下几段代码:

>>> a="fish is here"
>>> id(a)
12725288
>>> id(a+"")
12725288

(**) 如果非要使用可变的字符串,可以考虑bytearray类型。适用于python 2.6版本以上

>>> ba=bytearray(b"fish is here")
>>> ba
bytearray(b'fish is here')
>>> ba[2]="k"
>>> ba
bytearray(b'fikh is here')

标题无“转载”即原创文章,版权所有。转载请注明来源:http://hgoldfish.com/blogs/article/61/。


疑问?(Feb. 23, 2012, 12:20 p.m.)

如果说字符串不可以变,可是当使用了字符串方法,那么该字符串不是还是变了,那这该怎么解释呢?

goldfish(Feb. 29, 2012, 5:31 p.m.)

当然还是不可变啦。比如str.replace()这个方法,它会返回新的对象,而不会改变原来的字符串。


何不来发表一下您对本文的看法(使用Markdown语法,分段空两行):