В чем разница между этими двумя назначениями памяти? - PullRequest
1 голос
/ 24 сентября 2019

Сегодня я попытался разгадать ката, которая прошла через одну часть упражнения.Проблема, с которой я столкнулся, может быть упрощена до следующего нюанса:

node = [1]
root_node = node

node << 2

p node #[1,2]
p root_node #[1,2]

node = 1
root_node = node

new_node = 3
node = new_node


p node #3
p root_node #1

Почему node и root_node оба меняются, когда я изменяю массив, назначенный одной переменной, но присвоение значений переменной неНе можете изменить другое?

Я бы ожидал node = [1,2] и root_node = [1].

Может ли кто-то пролить свет на это или направить меня к документации по этому вопросу.Я не думаю, что когда-либо заметил, что это было так.Спасибо.

1 Ответ

1 голос
/ 24 сентября 2019

Когда вы присваиваете массив, переменная содержит значение ссылки на этот массив.Когда вы назначаете это другой переменной, ссылка копируется.Затем, когда вы вызываете <<, изменяющий массив, он виден под обеими переменными, поскольку существует только один массив.

Когда вы присваиваете целое число, значение этого целого числа сохраняется в переменной.Когда вы переназначаете его, в этой переменной сохраняется другое значение.Нет разницы, если вы переназначаете его, используя константу a = 1 или другую переменную a = b.

. Важно отметить, что назначение работает таким же образом и для массивов - значение ссылки переназначается.Если вы назначите другой массив, исходный массив не изменится.

node = [1]
root_node = node
new_node = [3]
node = new_node
p node
#[3]
p root_node
#[1]

См. Также:

...