AnyMath 文档

变量

在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 = "人人生而自由,在尊严和权利上一律平等。"
"人人生而自由,在尊严和权利上一律平等。"

允许使用Unicode名称(UTF-8编码):

julia> δ = 0.00001
1.0e-5

julia> 안녕하세요 = "Hello"
"Hello"

在Julia REPL和其他几个Julia编辑环境中,您可以通过键入反斜杠LaTeX符号名称后跟tab来键入许多Unicode数学符号。 例如,变量名 δ 可以通过键入输入 \三角洲-tab,甚至 α̂⁽²⁾\阿尔法-tab-\帽子-tab-\^(2)-tab. (如果你在某个地方找到了一个你不知道如何输入的符号,例如在别人的代码中,REPL帮助会告诉你:只需输入 ? 然后粘贴符号。)

Julia甚至会让您用本地常量和函数阴影现有的导出常量和函数(尽管不建议这样做以避免潜在的混淆):

julia> pi = 3
3

julia> pi
3

julia> sqrt = 4
4

julia> length() = 5
length (generic function with 1 method)

julia> Base.length
length (generic function with 79 methods)

但是,如果您尝试重新定义已显式导入的内置常量或函数,Julia会给您一个错误:

julia> using Base: pi, sqrt

julia> pi
π = 3.1415926535897...

julia> pi = 3
ERROR: cannot assign a value to imported variable Base.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
兼容性

Julia1.12请注意,在Julia1.12之前的版本中,这些错误取决于_use_而不是冲突绑定的定义。

允许的变量名称

变量名必须以字母(A-Z或a-z)、下划线或大于00a0的Unicode码位子集开头;特别是,https://www.fileformat.info/info/unicode/category/index.htm[Unicode字符类别]Lu/Ll/Lt/Lm/Lo/Nl(字母)、Sc/So(货币及其他符号)及其他一些类似字母的字符(例如Sm数学符号的子集)是允许的。 后续字符也可能包括! 和数字(0-9和类别Nd/No中的其他字符),以及其他Unicode代码点:变音符号和其他修改标记(类别Mn/Mc/Me/Sk),一些标点符号连接器(类别Pc),素数和其他一些字符。

运营商喜欢 + 也是有效的标识符,但要专门解析。 在某些上下文中,运算符可以像变量一样使用;例如 (+) 指加法函数,并且 (+)=f 会重新分配。 大多数Unicode中缀运算符(在Sm类别中),例如 ,被解析为中缀运算符,并可用于用户定义的方法(例如,您可以使用 const⊗=kron 要定义 作为中缀Kronecker产品)。 运算符还可以加上修改标记、素数和子/上标,例如 +ₐ" 被解析为中缀运算符,其优先级与 +. 以下标/上标字母结尾的运算符和随后的变量名之间需要一个空格。 例如,如果 +ᵃ 是运算符,则 +Xxxxx 必须写成 +ᵃ x 以区别于 +Xxxxx 哪里 ᵃx 是变量名。

一个特定的变量名类是一个只包含下划线的变量。 这些标识符是只写的。 即它们只能被分配值,这些值立即被丢弃,并且它们的值不能以任何方式使用。

julia> x, ___ = size([2 2; 1 1])
(2, 2)

julia> y = ___
ERROR: syntax: all-underscore identifiers are write-only and their values cannot be used in expressions

julia> println(___)
ERROR: syntax: all-underscore identifiers are write-only and their values cannot be used in expressions

唯一显式不允许的变量名称是内置变量的名称 关键词:

julia> else = false
ERROR: syntax: unexpected "else"

julia> try = "No"
ERROR: syntax: unexpected "="

某些Unicode字符在标识符中被认为是等效的。 输入Unicode组合字符的不同方式(例如重音符号)被视为等价的(具体来说,Julia标识符是https://en.wikipedia.org/wiki/Unicode_equivalence[NFC].Julia还包括一些非标准的等价字符,这些字符在视觉上是相似的,并且很容易被一些输入法输入。 Unicode字符 ɛ (U+025B:拉丁文小字母open e)和 µ (U+00B5:微符号)被视为等同于相应的希腊字母。 中间的点 · (U+00B7)和希腊文https://en.wikipedia.org/wiki/Interpunct[介入] · (U+0387)都被视为数学点运算符 (U+22C5)。 减号 (U+2212)被视为等同于连字符-减号 - (U+002D)。

赋值表达式和赋值与突变

任务 变量=值 "绑定"名称 变量价值 在右侧计算,并且整个赋值被Julia视为等于右侧的表达式 价值. 这意味着赋值可以是_chained_(相同 价值 分配给多个变量 变量1=变量2=值)或者在其他表达式中使用,这也是为什么它们的结果在REPL中显示为右侧的值。 (通常,REPL显示您评估的任何表达式的值。)例如,这里的值 4b=2+2 用于另一个算术运算和赋值:

julia> a = (b = 2+2) + 3
7

julia> a
7

julia> b
4

一个常见的混淆是_assignment_(为值赋予新的"名称")和_mutation_(更改值)之间的区别。 如果你跑 a=2 其次是 a=3,你已经改变了"名称" a 引用新值 3 …​ 你没有改变号码 2,所以 2+2 还是会给 4 而不是 6! 在处理类似_mutable_类型时,这种区别变得更加清晰 数组,其内容_can_被更改:

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 not_是否制作数组的副本 a,它只是绑定名称 b 到_same_数组 a:两者兼而有之 ba "指向"一个数组 [1,2,3] 在记忆中。 相比之下,赋值 a[i]=值 _changes_数组的_contents,修改后的数组将通过两个名称可见 ab:

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]=值 (别名为 setindex!)_mutates_内存中现有的数组对象,可通过任一 ab. 随后设置 a=3.14159 不改变这个数组,它只是绑定 a 到一个不同的对象;数组仍然可以通过 b. 改变现有对象的另一种常见语法是 a.字段=值 (别名为 setproperty!),其可用于改变a 可变结构. 也有通过点分配突变,例如 b.= 5:7 (这会改变我们的数组 b 就地容纳 [5,6,7]),作为朱莉娅的一部分 矢量化"点"语法

当你打电话给 function在Julia中,它的行为就好像您将参数值_assigned_为与函数参数对应的新变量名,如 参数传递行为。 (由 约定,改变一个或多个参数的函数的名称以 !.)

文体惯例

虽然Julia对有效名称施加的限制很少,但采用以下约定已变得有用:

*变量名称用小写。 *单词分隔可以用下划线表示('_'),但不鼓励使用下划线,除非名称否则难以阅读。 *姓名 类型s和 模块s以大写字母开头,单词分隔用上驼峰大小写而不是下划线显示。 *姓名 功能s和 s是小写的,没有下划线。 *写入其参数的函数的名称以 !. 这些函数有时被称为"突变"或"就地"函数,因为它们旨在在函数调用后对其参数进行更改,而不仅仅是返回值。

有关样式约定的更多信息,请参阅 风格指南