可变对象和不可变对象在所有编程语言中的实现方式都是一样的吗?

时间:2018-09-23 01:26:09

标签: python oop functional-programming imperative-programming

在OOP和函数式编程的整个范围内,不变性的主要思想保持不变,或者说,例如Java和Python都有自己的不变性版本。更具体地说,以下内容是否适用于所有语言?

  • 可变对象:集合,字典,列表
  • 不可变对象:Bool,Int,Float,String,Tuple
  • 在python中,两个具有相同值的不可变对象也具有相同的ID,两个引用一个值。
  • 再次在python中,两个具有相同值的可变对象不共享相同的ID,两个对象引用了两个值。
  • 在可变对象中将两个引用绑定在一起的想法是否适用于所有语言?反之亦然,即绑定不能更改,这意味着引用只能更改它们指向的值。

    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中),所以这不会改变整个不变性的概念吗?

2 个答案:

答案 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这样的东西,可能会发生实现自由重用相同文字的内存位置的情况,因此任何布尔结果都是可以接受的。