变量
在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显示您评估的任何表达式的值。)例如,这里的值 4 的 b=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:两者兼而有之 b 和 a "指向"一个数组 [1,2,3] 在记忆中。 相比之下,赋值 a[i]=值 _changes_数组的_contents,修改后的数组将通过两个名称可见 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]=值 (别名为 setindex!)_mutates_内存中现有的数组对象,可通过任一 a 或 b. 随后设置 a=3.14159 不改变这个数组,它只是绑定 a 到一个不同的对象;数组仍然可以通过 b. 改变现有对象的另一种常见语法是 a.字段=值 (别名为 setproperty!),其可用于改变a 可变结构. 也有通过点分配突变,例如 b.= 5:7 (这会改变我们的数组 b 就地容纳 [5,6,7]),作为朱莉娅的一部分 矢量化"点"语法。
文体惯例
虽然Julia对有效名称施加的限制很少,但采用以下约定已变得有用:
*变量名称用小写。
*单词分隔可以用下划线表示('_'),但不鼓励使用下划线,除非名称否则难以阅读。
*姓名 类型s和 模块s以大写字母开头,单词分隔用上驼峰大小写而不是下划线显示。
*姓名 功能s和 宏s是小写的,没有下划线。
*写入其参数的函数的名称以 !. 这些函数有时被称为"突变"或"就地"函数,因为它们旨在在函数调用后对其参数进行更改,而不仅仅是返回值。
有关样式约定的更多信息,请参阅 风格指南。