【发布时间】:2017-07-13 18:20:04
【问题描述】:
-
在 Python 中引入不可变对象的目的是什么?
-
它是否与使用参考模型的 Python 有关(即变量是指向对象而不是容器的指针? 对象的值)?
我猜不是,因为 Python 对所有类型都使用参考模型, 并非所有类型都需要不可变对象。
-
Python 中的不变性是否被用作函数范式的一部分?如果是,怎么做?
例如,我们不能通过分配给它的一个来更改字符串 职位。
>>> S 'Spam' >>> S[0] = 'z' # Immutable objects cannot be changed ...error text omitted... TypeError: 'str' object does not support item assignment但我们总是可以构建一个新的并将其分配给相同的名称。 这是否背叛了功能不变性的目的 范式,并与命令式范式保持一致?但是在命令式范式中,根据不变性和参考模型来实现可变性是低效的。
>>> S = 'z' + S[1:] # But we can run expressions to make new objects >>> S 'zpam'
-
-
某些类型被设计为使用不可变对象(数字、字符串、元组)而其他类型(列表、字典、集合)使用可变对象而不是所有类型不可变或可变的原因是什么?
是否有一些规则可以判断一个类型是否需要不变性或可变性? 原始对象(即相对于复合对象)是否必须是不可变的?
谢谢。
【问题讨论】:
-
Python 没有 原始类型。
-
不变性通常会减少错误代码,但是,可变和不可变对象各有利弊。一般来说,严格的功能范式不允许重新分配变量。虽然你可以不遗余力地编写 Python 的纯函数子集,但它基本上是一种命令式语言,其中包含一些函数构造。
-
不变性很有用。可变性很有用。我们都有。涵盖使用其中一种或另一种的所有原因,或者为什么某些类型是可变或不可变的,对于 Stack Overflow 问题来说过于宽泛,而且它实际上并不是一个 Python 问题。
-
不是完全重复,但解释了为什么整数是不可变的:stackoverflow.com/questions/37535694/…。简而言之,拥有不可变数据类型允许您将对象视为只是一个值。但正如@user2357112 一样,还有其他原因,列出所有这些对于 Stack Overflow 来说过于广泛。