Массивы и 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.
Проверьте себя
1. С какого индекса начинается нумерация элементов массива в Julia?
AС 0, как в Python
BС 1, как в MATLAB и Fortran
CС -1
DЗависит от типа массива
2. Сколько элементов вернёт срез v[2:4] для вектора из 5 элементов?
A2 элемента
B3 элемента (обе границы включаются)
C4 элемента
D1 элемент