Чем изменчивость отличается от присвоения нового значения переменной?

Скажем, у вас есть переменная:

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() и передать ему функции обратного вызова, если вы хотите сделать что-то вроде добавления элемента в список.


person Null Salad    schedule 22.12.2020    source источник
comment
Разница в том, что если две переменные ссылаются на один и тот же объект, изменение его по одной ссылке означает, что любые изменения также видны по другой ссылке; тогда как если вы создаете новый объект с другим состоянием и назначаете его одной переменной, другая переменная по-прежнему содержит ссылку на исходный неизмененный объект.   -  person kaya3    schedule 22.12.2020
comment
Ясно, означает ли это, что изменчивость как концепция в основном актуальна для языков без указателей?   -  person Null Salad    schedule 22.12.2020
comment
Я не понимаю, как это следует; указатель является своего рода ссылкой.   -  person kaya3    schedule 22.12.2020
comment
Идея неизменяемости заключается просто в том, что переменная не изменяется, то есть значение переменной всегда будет таким, каким оно было при инициализации. Это имеет много преимуществ и много недостатков. Как в случае добавления, так и в случае переназначения x значение переменных перестает быть тем, чем оно было при инициализации, поэтому ни в одном из примеров x не является неизменным. Я бы сказал, что взгляд на неизменность через призму React сбивает с толку, это самостоятельная идея, которую React использует, и да, это делает некоторые вещи утомительными.   -  person Countingstuff    schedule 22.12.2020


Ответы (1)


Есть переменные и есть значения. Переменные похожи на имена или адреса, по которым мы обращаемся к значениям. Изменчивость применяется к значениям, а не к переменным.

Изменяемое значение можно изменить на месте без создания нового значения. Например, если я создаю целочисленное значение и присваиваю ему значение, равное единице, я могу увеличить это значение, не выделяя место для нового целого числа; значение увеличивается на месте. Любые ссылки на это значение немедленно увидят изменение, потому что они ссылаются на одно значение, которое теперь было изменено или мутировано.

Неизменяемые значения нельзя изменить на месте. Предположим, что в нашем языке строки неизменяемы. Если я создаю строку и инициализирую ее значением hello world, невозможно изменить это значение без создания места для новой строки. Если я хочу изменить значение на goodbye world, я должен создать новое строковое значение с вновь выделенной памятью. Любые переменные, которые ссылались на исходное значение, будут продолжать делать это, пока они не будут обновлены, чтобы ссылаться на новое значение.

Постоянство — это аналогичная концепция, которая применяется к переменным и связана с тем, разрешено ли изменять объект, на который ссылается переменная. Это немного запутывается с примитивными типами; действительно, переменная const int должна быть увеличиваемой, поскольку увеличение int не изменяет память, на которую ссылаются, а только материал внутри этой памяти. Однако списки констант/только для чтения обычно могут быть добавлены и удалены без проблем, например, поэтому различие между постоянством (ссылки на переменную) и неизменностью (значения) здесь немного лучше сохраняется.

person Patrick87    schedule 28.12.2020