【问题标题】:How is mutability different from assigning a new value to a variable?可变性与为变量分配新值有何不同?
【发布时间】:2021-04-01 12:12:23
【问题描述】:

假设你有一个变量:

var x = [1,2]

如果它是一个可变对象,你可以这样做:

x.append(3)
x
>> [1,2,3]

但如果它是不可变的,并且您想更改 x 的值,您实际上必须这样做:

// init x
var x = [1,2]
// add a 3 to x
x = [1,2,3]
x
>> [1,2,3]

可变性和只改变变量有什么区别?

我最好的猜测是,当您执行 append(3) 时,它正在修改对内存中相同变量的引用,但是当您 x = [1,2,3] 时,您可能声明了一个新变量 x,引用了内存中的一个新块,并取消分配x=[1,2] 占用的旧块。

似乎不可变变量不应该改变。但是很多时候我们希望不可变的变量发生变化。例如,在 React 中,状态变量被认为是不可变的。但是拥有状态的目的是让变量可以改变。因此,要更改它们的值,您需要通过这些非常迂回的方式,例如调用setState(),并在您想要执行诸如将元素附加到列表之类的操作时为其提供回调函数。

【问题讨论】:

  • 不同之处在于,如果两个变量引用同一个对象,通过一个引用对其进行变异意味着任何更改也通过另一个引用可见;而如果您创建一个具有不同状态的新对象并将其分配给一个变量,则另一个变量仍保留对原始未更改对象的引用。
  • 我明白了,这是否意味着“可变性”作为一个概念主要与没有指针的语言相关?
  • 我不明白这是怎么回事;指针是一种引用。
  • 不变性的概念就是变量不会改变,即变量的值始终是初始化时的值。这有很多好处,也有很多缺点。在追加情况和重新分配 x 情况下,变量的值都不再是初始化时的值,因此这两个示例都没有 x 是不可变的。我想说,通过 React 的视角来看待不变性会让事情变得混乱,它本身就是一个想法,是的,React 使用它,是的,它让一些事情变得乏味

标签: theory mutable


【解决方案1】:

有变量,也有值。变量就像我们引用值的名称或地址。可变性适用于值,而不是变量。

可以就地更改可变值,而无需创建新值。例如,如果我创建一个整数值并将其赋值为 1,然后我可以增加该值而不为新整数分配空间;该值在原地增加。对该值的任何引用都将立即看到更改,因为它们指的是现在已更改或突变的一个值。

不可变的值不能就地更改。假设字符串在我们的语言中是不可变的。如果我创建一个字符串并将其初始化为值“hello world”,则不可能在不为新字符串创建空间的情况下更改该值。如果我想将值更改为“再见世界”,我必须使用新分配的内存创建一个新的字符串值。任何引用原始值的变量都将继续这样做,除非它们被更新为引用新值。

常量是一个类似的概念,适用于变量,与变量所引用的事物是否允许改变有关。这与原始类型有点混淆。实际上,一个 const int 变量应该是可递增的,因为递增 int 不会改变所引用的内存,只会改变该内存中的内容。但是,常量/只读列表通常可以毫无问题地添加和删除,例如,常量(变量引用)和不变性(值)之间的区别在这里得到了更好的保留。

【讨论】:

    【解决方案2】:

    所以当你声明一个新变量时,你创建了一个变量并且对应的值存储在RAM中,如果你使用variable = value语句那么你创建一个新值与旧值完全无关,旧值永远不会改变,是不变的。新值被分配给同一个变量,然后你调用同一个变量,它只是指向 RAM 中的不同位置,旧位置永远不会改变,你创建一个新的来替换它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-23
      • 2022-12-08
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多