关于python:可变和不可变对象在所有编程语言中实现相同?

Mutable and Immutable objects are implemented the same in all programming languages?

在OOP和函数编程的范围内,不变的主要思想是相同的,例如,Java和Python有它们自己的不可变版本。更具体地说,以下内容在所有语言中都适用吗?

  • 可变对象:set、dict、list
  • 不可变对象:bool、int、float、string、tuple
  • 在Python中,具有相同值的两个不可变对象也具有相同的ID,两个对象引用一个值。
  • 在Python中,具有相同值的两个可变对象不共享相同的ID,两个对象引用两个值。
  • 两个引用在可变对象中绑定在一起的想法在所有语言中都适用吗?相反,绑定也不能更改,这意味着引用只能更改它们指向的值。

    1
    2
    3
    4
    5
    6
    7
    8
    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语言中是通过值传递的),所以这不会改变不可变性的整个概念吗?


如果您有任何对象,甚至是文字对象,它需要在内存中使用一些空间。

这个内存需要被语言运行时改变,如果不可变,它是相同的。因此,可变对象在创建对象时会改变内存。

因此,不可变对象是确保在编译时不被更改或在程序运行时受运行时保护的对象。

In python two immutable objects with the same value also have the same
id, two references one value.

我认为这一点也不能保证。如。

1
2
3
4
x = (1,2,3)
y = (1,2,3)
x is y
// => False

当我在回复中运行它时。如果它与普通LISP和Java类似,则可能会实现实现相同的文字的内存位置的重用,因此任何布尔结果都是可以接受的。


我对python中可变与不可变的区别的理解是,第一个可以通过索引进行更改。例如,可以通过索引更改以下X列表!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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。