Массивы и 1-индексация
Базовый тип научного кода — массив. Главное отличие от Python: индексация начинается с единицы.
Массив (Array) — упорядоченная коллекция элементов одного (как правило) типа. Одномерный массив называют вектором.
Создание массивов
Вектор записывается в квадратных скобках через запятую:
v = [10, 20, 30, 40]
println(typeof(v))
println(length(v))Вывод:
Vector{Int64}
4Тип Vector{Int64} читается как «вектор из значений типа Int64». Если смешать типы, Julia выберет общий тип, например Vector{Float64} или Vector{Any}.
Главное отличие: 1-индексация
В Julia, как в MATLAB, Fortran и R, элементы нумеруются с единицы, а не с нуля. Для пришедших из Python это первое, к чему надо привыкнуть.
v = [10, 20, 30, 40]
println(v[1]) # первый элемент
println(v[end]) # последний элемент
println(v[end-1]) # предпоследнийВывод:
10 40 30
Ключевое слово end внутри индекса означает «последний элемент» — удобнее, чем v[length(v)]. Отрицательная индексация (как v[-1] в Python) в Julia не работает — используйте end.
Срезы
Срез задаётся диапазоном начало:конец, и обе границы включаются (в Python верхняя граница исключается):
v = [10, 20, 30, 40, 50]
println(v[2:4]) # со 2-го по 4-й включительно
println(v[1:2:end]) # каждый второй: 1, 3, 5
println(v[:]) # копия всего вектораВывод:
[20, 30, 40] [10, 30, 50] [10, 20, 30, 40, 50]
Изменение массива
Функции, меняющие массив на месте, по соглашению заканчиваются на !:
v = [1, 2, 3]
push!(v, 4) # добавить в конец
pushfirst!(v, 0) # добавить в начало
pop!(v) # удалить последний
println(v)Вывод:
[0, 1, 2, 3]
Как работает под капотом
Почему 1-индексация? Julia ориентирована на математику и науку, где векторы и матрицы традиционно нумеруют с 1 (x₁, x₂, …). Это сближает код с формулами. Под капотом массив Julia — это плотный непрерывный блок памяти с элементами одного типа, как в C-массиве или NumPy. Именно поэтому массив Vector{Int64} обрабатывается так же быстро, как массив в C: компилятор знает точный тип каждого элемента и его размер.
Частые ошибки
Самая частая ошибка для бывших Python-разработчиков — обращение к v[0]. В Julia это вызовет BoundsError, потому что индексация начинается с 1. Вторая ловушка — забыть, что верхняя граница среза включается: v[1:3] в Julia возьмёт 3 элемента, а не 2, как в Python.
Итоги
- Вектор создаётся в квадратных скобках:
[1, 2, 3]. - Индексация начинается с 1; последний элемент —
v[end]. - Срезы включают обе границы:
v[2:4]— три элемента. - Изменяющие функции заканчиваются на
!:push!,pop!. - Массив — плотный блок памяти, что обеспечивает скорость, близкую к C.