可变对象和不可变对象在所有编程语言中的实现都是一样的吗?
Mutable and Immutable objects are implemented the same in all programming languages?
不变性的主要思想在 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 中我们两者都有)所以这不会改变整个不变性的概念吗?
我对 python 中可变与不可变之间的区别的理解是,第一个可以通过索引更改。比如下面的x列表可以通过索引改变!
x = [1,2,3]
x[0] = 10
y = (1,2,3)
y[0] = 10 # this will raise an error. tuple is not mutable.
y = x
id(y) == id(x) #gives true. since y is a reference to x
y[0] = 10
print(y)
[10, 2, 3]
print(x)
[10, 2, 3] # x is changed as well! y and x are same same.
每次您创建具有唯一名称的列表或集合或元组时,即使它们包含相同的数据集,它们仍然不是映射到内存中的相同列表。每个都有其唯一的ID。
如果你有任何对象,即使是文字对象,它也需要在内存中使用一些 space。
这个内存需要被语言运行时间变异,不可变和不可变都是一样的。因此,可变对象在创建对象时会改变内存。
因此,不可变对象是确保在编译时不被更改或在程序 运行 时受到 运行 时间保护的对象。
In python two immutable objects with the same value also have the same
id, two references one value.
我认为这根本无法保证。例如。
x = (1,2,3)
y = (1,2,3)
x is y
// => False
当我 运行 它在我的回复中。如果它类似于 Common Lisp 和 Java,则可能会发生实现可以自由重用相同文字的内存位置,因此任何布尔结果都是可以接受的。
不变性的主要思想在 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 中我们两者都有)所以这不会改变整个不变性的概念吗?
我对 python 中可变与不可变之间的区别的理解是,第一个可以通过索引更改。比如下面的x列表可以通过索引改变!
x = [1,2,3]
x[0] = 10
y = (1,2,3)
y[0] = 10 # this will raise an error. tuple is not mutable.
y = x
id(y) == id(x) #gives true. since y is a reference to x
y[0] = 10
print(y)
[10, 2, 3]
print(x)
[10, 2, 3] # x is changed as well! y and x are same same.
每次您创建具有唯一名称的列表或集合或元组时,即使它们包含相同的数据集,它们仍然不是映射到内存中的相同列表。每个都有其唯一的ID。
如果你有任何对象,即使是文字对象,它也需要在内存中使用一些 space。
这个内存需要被语言运行时间变异,不可变和不可变都是一样的。因此,可变对象在创建对象时会改变内存。
因此,不可变对象是确保在编译时不被更改或在程序 运行 时受到 运行 时间保护的对象。
In python two immutable objects with the same value also have the same id, two references one value.
我认为这根本无法保证。例如。
x = (1,2,3)
y = (1,2,3)
x is y
// => False
当我 运行 它在我的回复中。如果它类似于 Common Lisp 和 Java,则可能会发生实现可以自由重用相同文字的内存位置,因此任何布尔结果都是可以接受的。