为什么python字符串和元组是不可变的?

Why are python strings and tuples are made immutable?

我不知道为什么字符串和元组是不可变的;使它们不可变的优点和缺点是什么?


所谓的fakemutablepython Imagine a语言,你可以在搜索字符串的赋值和年龄使用列表(如mystr[0] = 'a')

1
a ="abc"

这是创建在内存中存储的地址进入0x1,含"ABC",和标识符a指向它。

现在,说你做的。

1
b = a

b点创建的标识符和它同一个内存地址0x1

现在,如果你的字符串是mutable,b变更:

1
b[0] = 'z'

这个年龄的第一个字节的字符串存储在一个z0x1。标识符是从一个a来指向字符串,因此这会改变的,所以……

1
2
print a
print b

两个输出..would zbc

这可以让一些真正奇怪,意想不到的行为。字典的键是一个很好的例子是这样:

1
2
3
4
5
6
7
8
mykey = 'abc'
mydict = {
    mykey: 123,
    'zbc': 321
}

anotherstring = mykey
anotherstring[0] = 'z'

现在事情变得fakemutablepython奇,而你的词典中有两个键,"ABC"和"ZBC"。然后你的年龄"abc"字符串(通过"标识符"anotherstringZBC)",因此"双键的安切洛蒂,ZBC"和"ZBC"……

一个可能的解决方案在本weirdness,每当你分配一个标识符的字符串(或使用它作为一个关键的副本),它是在具备0x1字符串。

这可防止上面的,但如果你有一个字符串,需要200内存?

1
2
a ="really, really long string [...]"
b = a

突然,你的脚本需要启动400MB的记忆?这不是很好。

我们点什么,如果它同一个内存地址,直到我们修改它?copy on write。这个问题是相当复杂的,可以做的。

这是immutability是在哪里。而不是要求的.replace()同体复制到一个新的字符串从内存地址,然后修改它的回报。我们只是让所有的不可变的字符串和函数,因此必须创建一个新字符串返回。这解释了以下的代码:

1
2
a ="abc"
b = a.replace("a","z")

证明和是由:

1
2
3
4
5
6
7
>>> a = 'abc'
>>> b = a
>>> id(a) == id(b)
True
>>> b = b.replace("a","z")
>>> id(a) == id(b)
False

(id()函数返回的对象的内存地址)


One is performance: knowing that a
string is immutable makes it easy to
lay it out at construction time —
fixed and unchanging storage
requirements. This is also one of the
reasons for the distinction between
tuples and lists. This also allows the
implementation to safely reuse string
objects. For example, the CPython
implemenation uses pre-allocated
objects for single-character strings,
and usually returns the original
string for string operations that
doesn’t change the content.

The other is that strings in Python
are considered as"elemental" as
numbers. No amount of activity will
change the value 8 to anything else,
and in Python, no amount of activity
will change the string"eight" to
anything else.

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


一大优势是,他们制作的不可变的,他们可以被用来作为在一个字典的键。我可以使用内部数据结构词典是由他们的时间点,如果把钥匙是没有改变。


不可变的类型是conceptually多mutable比简单酮。例如,你不constructors测量与复制或const的正确性在C + +类。越是不可变类型,语言变得更容易。因此,在最简单的语言是纯粹的功能状态(因为没有任何一个lambda演算的全球多更容易比图灵机,和同样强大的),虽然很多人不欣赏的人。


Perl的字符串函数和mutable安切洛蒂似乎只是罚款。上面的手似乎很多rationalization挥手和一个任意的设计决策。

我的答案的问题,为什么Python Python字符串不可变的安切洛蒂,Guido van Rossum通缉的创造者,因为它现在已经这样,他都是个特殊的legions任意决策和呼吸死亡。

你可以有类似的姿势的问题为什么Perl没有不可变的字符串和一个完整的人会写在passel知识观的字符串是不可变的,以及为什么它是非常bestest IDEA"(TM)是Perl没有他们。


优点:性能

缺点:你不能改变mutables。