python的设计目的,关于语言设计:在Python中引入不可变对象的目的?

在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子集,但它基本上是一种命令式语言,其中包含一些函数构造。

不变性是有用的。易变性是有用的。我们都有。覆盖使用其中一个或另一个的所有原因,或者为什么某些类型是可变的或不可变的,对于堆栈溢出问题来说,这将是一个非常宽泛的问题,而这实际上并不是一个Python问题。

不是完全重复,但解释了整数不可变的原因:stackoverflow.com/questions/37535694/…。简而言之,拥有不变的数据类型可以让您将对象视为一个值。但是,作为@user2357112,还有其他原因导致并列出所有这些原因对于堆栈溢出来说可能远远不够。

What are the purposes of introducing immutable objects in Python?

在任何语言中引入不可变对象有什么意义?

...we can’t change a string by assigning to one of its positions... But we can always build a new one and assign it to the same name. Does that betrays the purpose of immutability in functional paradigm, and aligns with imperative paradigm? But in imperative paradigm, implementing mutability in terms of immutability and reference model is inefficient.

这在实现中并不少见,实际上-c字符串的实现方式完全相同(对不可变对象的可变引用)。

有些语言(如C)使用字符串数组时,字符串长度实际上是不可变的(但每个字符都是可变的)。

请记住,"不可变"有许多相互竞争的定义。(我读了一篇列出并解释了所有这些定义的文章,但我现在找不到它)。例如,它是否意味着对可变对象的常量引用(浅不可变)?还是对不可变对象的常量引用(深度不可变)?或者甚至是对不可变对象的"非固定"引用?它实际上取决于您希望使不可变性有多"深度",以及如何在不"破坏"向后兼容性的情况下实现它。(在向后兼容性问题上,请注意,C++、C**、Java、F.*和许多其他语言实际上必须为常数变量引入特殊关键字——例如,在Java中,EDCOX1,0,EDCOX1,1,F,EDOCX1,2,C)。

另一点是:许多语言(c_,python)都有功能特性,而不一定是纯粹的(甚至主要的)功能语言本身。很多时候(例如,在C语言中),功能特性在技术上是语言的新添加,因此一些功能特性可能不会像您希望的那样以"纯粹的"功能风格实现,以保持向后兼容性。

另外,允许使用多个范例的部分结果是,您通常可以以不总是完全健康的方式"混合"它们——从句法角度来看,"禁止"范例混合通常是困难的或不可能的。

What are the reason that some types are designed to use immutable objects (numbers, strings, tuples), while other types (lists, dictionaries, sets) use mutable objects, instead of all the types immutable or mutable?

因为Python是一种多范式语言。不可变的数据类型适用于函数式编程,但通常需要可变的数据类型用于面向对象编程。因此,语言必须具有适合这两种范式的特性。正如有关Python功能特性的官方文档所述,

The designers of some computer languages choose to emphasize one particular approach to programming. This often makes it difficult to write programs that use a different approach. Other languages are multi-paradigm languages that support several different approaches. Lisp, C++, and Python are multi-paradigm; you can write programs or libraries that are largely procedural, object-oriented, or functional in all of these languages. In a large program, different sections might be written using different approaches; the GUI might be object-oriented while the processing logic is procedural or functional, for example.

所以,基本上,python希望允许您选择您的范例(或者甚至能够在同一个程序中混合它们)。这实际上非常方便——许多框架(例如.net)现在都在鼓励它。(例如,wpf/xaml倾向于鼓励gui的声明性范式)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值