Изменяя копию таблицы, меняется оригинальная таблица.

Страницы: 1
RSS
Изменяя копию таблицы, меняется оригинальная таблица., Особенность языка lua?
 
Обнаружил неприятную (для себя) штуку. Нужно проанализировать как-то таблицу. В моем конкретном случае понадобилось выбросить несколько максимальных значений и найти среднее среди остальных.


Соответственно, я создал копию таблицы простым присваиванием. Затем отсортировал копию, по неполному циклу прогнал этот массив - сложил элементы, потом разделил на число оставшихся элементов. Обнаружил, что после сортировки оказалась отсортированной и оригинальная таблица. Что за фигня? Очень непривычная особенность языка.

Получается, когда я присваиваю массив, я фактически просто создаю ссылку на оригинальный массив. При обращении по любому имени редактируются одни и те же данные? Как создать фактическую копию таблицы? По элементам в цикле присваивать? :))
 
Цитата
Сергей написал:
Обнаружил неприятную (для себя) штуку. Нужно проанализировать как-то таблицу. В моем конкретном случае понадобилось выбросить несколько максимальных значений и найти среднее среди остальных.


Соответственно, я создал копию таблицы простым присваиванием. Затем отсортировал копию, по неполному циклу прогнал этот массив - сложил элементы, потом разделил на число оставшихся элементов. Обнаружил, что после сортировки оказалась отсортированной и оригинальная таблица. Что за фигня? Очень непривычная особенность языка.

Получается, когда я присваиваю массив, я фактически просто создаю ссылку на оригинальный массив. При обращении по любому имени редактируются одни и те же данные? Как создать фактическую копию таблицы? По элементам в цикле присваивать? :))
Смотрите документацию Lua

https://www.lua.org/manual/5.3/manual.html#3.3.3

Там сказано:

Цитата
Tables, functions, threads, and (full) userdata values are objects: variables do not actually contain these values, only references to them. Assignment, parameter passing, and function returns always manipulate references to such values; these operations do not imply any kind of copy.
 
Цитата
Смотрите документацию Lua

https://www.lua.org/manual/5.3/manual.html#3.3.3

Там сказано:

Цитата
Tables, functions, threads, and (full) userdata values are objects: variables do not actually contain these values, only references to them. Assignment, parameter passing, and function returns always manipulate references to such values; these operations do not imply any kind of copy.
Жесть... Как люди с этим живут? :) В цикле по элементам копию создавать для манипуляций без повреждения оригинала?
 
A как вы в с++ (подавляющем большинстве других языков) с этим живёте?

размножение таблиц есть плохая практика. Это и расход процессора, и фрагментации памяти и лишняя работа для сборщика мусора.

лучше строить алгоритм так, чтобы размножение агрегатных данных не требовалось.
 
Сергей и Mike, спасибо вам!
Страницы: 1
Читают тему (гостей: 1)
Наверх