在OOP和函数式编程的整个范围内,不变性的主要思想保持不变,或者说,例如Java和Python都有自己的不变性版本。更具体地说,以下内容是否适用于所有语言?
在可变对象中将两个引用绑定在一起的想法是否适用于所有语言?反之亦然,即绑定不能更改,这意味着引用只能更改它们指向的值。
i = {1,2,3} # Set, a mutable object
j = {1,2,3}
i is j
False
i = j
j.remove(3)
i is j
True
我之所以问是因为,例如在脚本语言中,对象是通过引用传递的(在其他按值传递的语言中,或者在我们同时拥有两种语言的C中),所以这不会改变整个不变性的概念吗?
答案 0 :(得分:0)
我对python中可变与不可变之间的区别的理解是,第一个可以通过索引更改。例如,以下x列表可以通过建立索引来更改!
println
每次您创建具有唯一名称的列表或集合或元组时,即使它们包含相同的数据集,它们仍然不是映射到内存中的相同列表。每个都有唯一的ID。
答案 1 :(得分:0)
如果您有任何对象,甚至是文字对象,它都需要在内存中使用一些空间。
此内存需要由语言运行时进行更改,无论是否不可更改,该内存都是相同的。因此,可变对象在创建对象时会改变内存。
因此,一个不变的对象可以确保在编译时不对其进行更改,或者在程序运行时受到运行时的保护。
在python中,两个具有相同值的不可变对象也具有相同的值 id,两个引用一个值。
我认为这根本不能保证。例如。
x = (1,2,3)
y = (1,2,3)
x is y
// => False
当我在自己的repl中运行它时。如果像Common Lisp和Java这样的东西,可能会发生实现自由重用相同文字的内存位置的情况,因此任何布尔结果都是可以接受的。