Purposes of introducing immutable objects in Python?
在Python中引入不可变对象的目的是什么?
是否与使用引用模型的Python有关(即变量是指向对象的指针,而不是对象的值?
我想不是,因为python对所有类型都使用引用模型,并非所有类型都需要不可变的对象。
Python中的不可变性是否被用作功能范式的一部分?如果是,怎么办?
例如,我们不能通过将字符串的位置。
1
2
3
4
5>>> S
'Spam'
>>> S[0] = 'z' # Immutable objects cannot be changed
...error text omitted...
TypeError: 'str' object does not support item assignment但我们总是可以构建一个新的并将其分配给相同的名称。这是否违背了函数中不变的目的?范式,并与命令式范式一致?但在命令式范式中,从不变性和参考模型的角度实现可变性是低效的。
1
2
3>>> S = 'z' + S[1:] # But we can run expressions to make new objects
>>> S
'zpam'
为什么有些类型设计为使用不可变对象(数字、字符串、元组),而其他类型(列表、字典、集合)使用可变对象,而不是所有不可变或可变类型?
是否有一些经验来判断一个类型是否需要不可变性或可变性?基本对象(即与复合对象相反)是否必须是不可变的?
谢谢。
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的声明性范式)。