Переменные
Переменная в Julia — это имя, связанное (или привязанное) к значению. Она полезна, когда необходимо сохранить значение (например, полученное после выполнения математических операций) для дальнейшего использования. Например:
# Assign the value 10 to the variable x julia> x = 10 10 # Doing math with x's value julia> x + 1 11 # Reassign x's value julia> x = 1 + 1 2 # You can assign values of other types, like strings of text julia> x = "Hello World!" "Hello World!"
Julia предоставляет чрезвычайно гибкую систему именования переменных. Имена переменных чувствительны к регистру и не имеют семантического значения (то есть язык не будет обрабатывать переменные по-разному на основе их имён).
julia> x = 1.0 1.0 julia> y = -3 -3 julia> Z = "My string" "My string" julia> customary_phrase = "Hello world!" "Hello world!" julia> UniversalDeclarationOfHumanRightsStart = "人人生而自由,在尊严和权利上一律平等。" "人人生而自由,在尊严和权利上一律平等。"
Допускаются имена с использованием Юникода (в кодировке UTF-8):
julia> δ = 0.00001 1.0e-5 julia> 안녕하세요 = "Hello" "Hello"
В интерактивной оболочке Julia REPL и некоторых других средах разработки Julia вы можете вводить множество математических символов Юникода, набрав обратную косую черту, имя символа в LaTeX, а затем нажав клавишу Tab. Например, имя переменной δ можно ввести, набрав \delta-Tab, или даже α̂⁽²⁾ набрав \alpha-Tab-\hat- Tab-\^(2)-Tab. (Если вы найдёте символ где-то, например, в чужом коде, и не знаете, как его ввести, помощь REPL подскажет: просто наберите ? и вставьте символ.)
Julia даже позволяет переопределять встроенные константы и функции, если это необходимо (хотя это не рекомендуется, чтобы избежать потенциальных недоразумений):
julia> pi = 3 3 julia> pi 3 julia> sqrt = 4 4
Однако, если вы попытаетесь переопределить встроенную константу или функцию, которая уже используется, Julia выдаст ошибку:
julia> pi π = 3.1415926535897... julia> pi = 3 ERROR: cannot assign a value to imported variable MathConstants.pi from module Main julia> sqrt(100) 10.0 julia> sqrt = 4 ERROR: cannot assign a value to imported variable Base.sqrt from module Main
Разрешённые имена переменных
Имена переменных должны начинаться с буквы (A-Z или a-z), нижнего подчёркивания или подмножества кодовых точек Юникода, больших, чем 00A0; в частности, разрешены категории символов Юникода Lu/Ll/Lt/Lm/Lo/Nl (буквы), Sc/So (валюты и другие символы), а также несколько других символов, похожих на буквы (например, подмножество математических символов Sm). Последующие символы также могут включать ! и цифры (0-9 и другие символы в категориях Nd/No), а также другие кодовые точки Юникода: диакритические знаки и другие модифицирующие знаки (категории Mn/Mc/Me/Sk), некоторые знаки пунктуации (категория Pc), штрихи и несколько других символов.
Операторы, такие как +, также являются допустимыми идентификаторами, но обрабатываются особым образом. В некоторых контекстах операторы могут использоваться как переменные; например, (+) относится к функции сложения, а (+) = f переприсвоит её. Большинство инфиксных операторов Юникода (в категории Sm), таких как ⊕, анализируются как инфиксные операторы и доступны для пользовательских методов (например, вы можете использовать const ⊗ = kron для определения ⊗ как инфиксного произведения Кронекера). Операторы также могут быть снабжены модификаторами, штрихами и под- и надстрочными индексами, например, +̂ₐ″ анализируется как инфиксный оператор с тем же приоритетом, что и +. Между оператором, заканчивающимся буквой подстрочного/надстрочного индекса, и последующим именем переменной требуется пробел. Например, если +ᵃ — это оператор, то +ᵃx должно быть записано как +ᵃ x, чтобы отличить его от + ᵃx, где ᵃx — это имя переменной.
Особым классом имён переменных являются имена, содержащие только нижние подчёркивания. Эти идентификаторы могут быть назначены значения, которые немедленно удаляются, и поэтому не могут использоваться для присваивания значений другим переменным (т. е., они не могут использоваться как rvalues) или использовать последнее присвоенное им значение каким-либо образом.
julia> x, ___ = size([2 2; 1 1]) (2, 2) julia> y = ___ ERROR: syntax: all-underscore identifier used as rvalue julia> println(___) ERROR: syntax: all-underscore identifier used as rvalue
Единственные явно запрещённые имена переменных — это имена встроенных ключевых слов:
julia> else = false ERROR: syntax: unexpected "else" julia> try = "No" ERROR: syntax: unexpected "="
Некоторые символы Юникода считаются эквивалентными в идентификаторах. Разные способы ввода символов Юникода с комбинацией (например, акцентов) рассматриваются как эквивалентные (в частности, идентификаторы Julia нормализованы по стандарту NFC). Julia также включает несколько нестандартных эквивалентностей для символов, которые визуально похожи и легко вводятся с помощью некоторых методов ввода. Символы Юникода ɛ (U+025B: латинская малая буква открытое е) и µ (U+00B5: микрознак) рассматриваются как эквивалентные соответствующим греческим буквам. Средняя точка · (U+00B7) и греческая интерпункция · (U+0387) обе рассматриваются как математический оператор точки ⋅ (U+22C5). Знак минус − (U+2212) рассматривается как эквивалентный знаку тире - (U+002D).
Выражения присваивания и присваивание против мутации
Присваивание variable = value "привязывает" имя variable к значению value, вычисленному в правой части, и всё присваивание рассматривается Julia как выражение, равное значению правой части value. Это означает, что присваивания можно цепочить (одно и то же value присваивается многим переменным с variable1 = variable2 = value ) или использовать в других выражениях, а также объясняет, почему их результат отображается в REPL как значение правой части. (Вообще, REPL отображает значение любого выражения, которое вы оцениваете.) Например, здесь значение 4 переменной b = 2+2 используется в другой арифметической операции и присваивании:
julia> a = (b = 2+2) + 3 7 julia> a 7 julia> b 4
Распространённым недоразумением является различие между присваиванием (присвоение нового "имени" значению) и мутацией (изменение значения). Если вы выполните a = 2 за которым следует a = 3, вы измените "имя" a на ссылку на новое значение 3 … вы не измените число 2, поэтому 2+2 всё ещё даст 4, а не 6! Это различие становится более ясным при работе с изменяемыми типами, такими как массивы, содержимое которых можно изменить:
julia> a = [1,2,3] # an array of 3 integers
3-element Vector{Int64}:
1
2
3
julia> b = a # both b and a are names for the same array!
3-element Vector{Int64}:
1
2
3
Здесь строка b = a не создаёт копию массива a, она просто привязывает имя b к тому же массиву a: и b, и a "указывает" на один массив [1,2,3] в памяти. В отличие от этого, присваивание a[i] = value изменяет содержимое массива, и изменённый массив будет виден через оба имени a и b:
julia> a[1] = 42 # change the first element
42
julia> a = 3.14159 # a is now the name of a different object
3.14159
julia> b # b refers to the original array object, which has been mutated
3-element Vector{Int64}:
42
2
3
То есть a[i] = value (псевдоним для setindex!) изменяет существующий объект массива в памяти, доступный через a или b. Последующее присваивание a = 3.14159 не изменяет этот массив, оно просто привязывает a к другому объекту; массив всё ещё доступен через b. Другой распространённый синтаксис для изменения существующего объекта — a.field = value (псевдоним для setproperty!), который можно использовать для изменения mutable struct.
Когда вы вызываете функцию в Julia, она ведёт себя так, как если бы вы присвоили значения аргументов новым именам переменных, соответствующим аргументам функции, как описано в Поведении передачи аргументов. (По конвенции, функции, которые изменяют один или несколько своих аргументов, имеют имена, оканчивающиеся на !.)
Стилевые рекомендации
Хотя Julia накладывает немного ограничений на допустимые имена, стало полезно принять следующие рекомендации:
- Имена переменных — строчные.
- Разделение слов может быть указано символом нижнего подчёркивания (
'_'), но от использования подчёркиваний следует воздержаться, если имя без него легко читается. - Имена структур и типов данных начинаются с заглавной буквы, и разделение слов делается с использованием верхнего верблюжьего регистра вместо подчёркиваний.
- Имена функций и методов — строчные, без подчёркиваний.
- Функции, которые записывают в свои аргументы, имеют имена, оканчивающиеся на
!. Иногда их называют «функциями изменения» или «функциями in-place», поскольку они предназначены для изменения своих аргументов после вызова функции, а не только для возврата значения.
Дополнительную информацию о стилистических рекомендациях можно найти в Руководстве по стилю.
© 2009–2023 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/v1.9/manual/variables/