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

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

除了Python解释器的内部实现,这种设计在编写程序上是否有很好的意义?(例如,如果元组和字符串是可变的,会更容易吗?)如果是这样,那么选择不可变元组和列表的例子是什么?(或pherhaps、可变字符串与python字符串)

有一种称为函数式编程的完整编程风格,其中所有东西都是不可变的。en.wikipedia.org/wiki/functional_编程

python确实有可变的字符串和元组;它们分别拼写为bytearray和list。

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

a ="abc"

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

现在,说你做的。

b = a

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

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

b[0] = 'z'

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

print a

print b

两个输出..would zbc

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

mykey = 'abc'

mydict = {

mykey: 123,

'zbc': 321

}

anotherstring = mykey

anotherstring[0] = 'z'

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

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

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

a ="really, really long string [...]"

b = a

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

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

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

a ="abc"

b = a.replace("a","z")

证明和是由:

>>> a = 'abc'

>>> b = a

>>> id(a) == id(b)

True

>>> b = b.replace("a","z")

>>> id(a) == id(b)

False

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

+1最佳答案。真的?

我听过最好的解释!

那么,如果我说a="abc",b="abcd"它会共享abc吗?就像b[:4]是a?

@Dineshkumar不,我很确定"abc"和"abcd"是不同的,完全无关的,对象-stackoverflow.com/questions/5722006/…

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

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

您可以通过任何用户创建的对象实例(显然是可变的)进行键控。然后"key"可能只是内存地址,如果字符串是可变的,您仍然可以通过它们的唯一内存地址来设置key。

@triptych不是你想要的字符串——你希望它们按值键,否则字典就没什么用处了……

@Hejazzman这不是python指令的工作方式。文字字符串值不用作dict键,而是采用字符串的哈希值。用'abc'.__hash__()向自己证明这一点。

@你说的每一句话都是错的。首先,可以有两个地址不同的相等字符串,因此使用该地址不起作用。第二,当dict使用字符串的散列时,关键是字符串本身——通过显示d.keys()来证明它。您可以很容易地拥有两个具有相同哈希值的字符串,而dict会将它们分开。

@标记勒索而不是地址,哈希。根据定义,不能有两个具有相同哈希值但具有不同哈希值的字符串进行比较。

@你八年前的第一次评论是关于记忆地址的,但我当时没有回复。正确的做法是,不能使用相同的字符串和不同的哈希值,但可以使用相同的哈希值使用不同的字符串!散列本身不足以作为密钥,它只是机制的一部分。

@triptych我知道python dicts是如何工作的(或者任何语言的hashmaps)。这不是我的观点。我的观点是,相同的字符串应该能够指向相同的条目,对于可变的字符串(以及它们作为hashmap中的键的"唯一内存地址")则不是这样。然后需要有完全相同的字符串指针,而不仅仅是相同的字符串内容,才能从字典中获取条目。

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

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

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

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

Perl实际上没有字符串:它有scalar,可以作为字符串或数字(后者有多种类型)。如果scalar是不可变的,它将成为纯粹的函数Perl,世界各地的Perl开发人员将通过为自己分配UNdef来自杀。

优点:性能

缺点:你不能改变mutables。

专家:你不能改变它们

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值