“ : =”做什么?

我在几个代码示例中看到过使用 :=,但从未附带解释。如果不知道它的正确名称,那么在谷歌上搜索它的用途是不可能的。

它有什么用?

96997 次浏览

有些语言使用 :=作为赋值运算符。

这是赋值运算符的旧语法(pascal) ,应该这样使用:

a := 45;

它可能也在其他语言中,可能也有类似的用法。

Http://en.wikipedia.org/wiki/equals_sign#in_computer_programming

在计算机编程语言中,等号通常表示一个布尔运算符来测试值的相等性(例如在 Pascal 或 Eiffel 中) ,这与符号在数学中的用法是一致的,或者表示一个赋值运算符(例如在类 C 语言中)。作出前一种选择的语言通常使用冒号-equals (: =)或 something 来表示它们的赋值运算符。选择后者的语言通常使用一个双等号(= =)来表示它们的布尔相等运算符。

注意: 我通过搜索 colon equals operator找到了这个

在许多 CS 书籍中,它被用作赋值操作符,以区别于等式操作符 =。但是,在许多高级语言中,赋值是 =,等式是 ==

它是 Pascal 中的 赋值运算符赋值运算符,经常用于证明和伪代码。这和 C 方言中的 =是一样的。

历史上,计算机科学论文使用 =进行等式比较,使用 进行作业。Pascal 使用 :=代替难以输入的左箭头。C 选择了不同的方向,而是决定使用 ===运算符。

在静态类型语言 去吧中,:=是初始化和赋值一步到位的。这样做是为了允许在编译语言中创建类似于解释的变量。

// Creates and assigns
answer := 42


// Creates and assigns
var answer = 42

冒号等于在 Algol 及其后代(如 Pascal 和 Ada)中使用,因为它非常接近于 ASCII 的左箭头符号。

使用 equals 作为赋值和 double-equals 作为比较的奇怪约定是从 C 语言开始的。

在 Prolog 中,赋值和相等性测试之间没有区别。

另一种来自编程语言世界之外的解释来自 MathWorld等:

如果 A 和 B 在定义上是相等的(例如,A 被定义为 B) ,那么这个符号被写成 A = B,A: = B,或者有时候是 A something B。

http://mathworld.wolfram.com/Defined.html

https://math.stackexchange.com/questions/182101/appropriate-notation-equiv-versus

它就像一个没有使用小于号 < = 的箭头,就像每个人都说过的“赋值”操作符一样。使被设置为与等价的逻辑运算符相对的位置变得清晰。

在数学中,它类似于等式,但是 A: = B 意味着 A 被定义为 B,一个三巴等式可以用来表示它的定义是相似和相等的,但并不总是相同的东西。

无论如何,我指出这些其他的参考,可能在那些发明它的人的头脑中,但它实际上只是平面等于和更少的等于被采取(或可能很容易与 = <)和新的东西来定义赋值是必要的,这是最有意义的。

历史参考: 我第一次看到这个是在 SmallTalk 的原始对象语言,其中苹果的 SJ 只是复制了微软的 Windows 部分和 BG 的进一步稀释(单线程)。最终,NeXT 中的 SJ 从施乐 PARC 中学到了第二个更重要的经验,即目标 C。

不管怎样,他们只是从 ALGOL 1958中选取了冒号等于赋值运算符,这个运算符后来被 Pascal 推广

Https://en.wikipedia.org/wiki/parc_(company)

Https://en.wikipedia.org/wiki/assignment_(computer_science)

赋值通常允许变量将不同的值保存在 在其生命周期和范围内的不同时期。然而,一些 语言(主要是严格的函数)不允许这种 “破坏性”的重新分配,因为它可能意味着非局部的变化 国家。 其目的是强制执行参照透明度(计算机科学) ,即职能 它不依赖于某些变量的状态,而是产生 对于给定的一组参数输入,在 时间。

Https://en.wikipedia.org/wiki/referential_transparency

对于 VB.net 来说,

一个构造函数(在 Java 中,Me = this) :

Public ABC(int A, int B, int C){
Me.A = A;
Me.B = B;
Me.C = C;
}

当您创建该对象时:

new ABC(C:=1, A:=2, B:=3)

然后,不管参数的顺序如何,ABC 对象都有 A = 2,B = 3,C = 1

因此,对于其他人来说,有效地阅读您的代码是一个非常好的实践

许多编程语言,最著名的是 帕斯卡艾达,使用一个冒号紧接着一个等号(:=)作为 赋值运算符赋值运算符,以区分它与单个等号(相等测试)(C 代替使用单个等号作为赋值,双等号作为相等测试)。

参考资料: 冒号(标点符号)

巨蟒:

命名表达式 (NAME := expr)是在 Python 3.8中引入的。它允许在当前正在计算的表达式中赋值变量。冒号等于运算符 :=有时被称为 海象操作员,因为它看起来像海象的表情符号。

例如:

if any((comment := line).startswith('#') for line in lines):
print(f"First comment: {comment}")
else:
print("There are no comments")

如果将 :=替换为 =,这将是无效的。请注意命名表达式周围的附加括号。另一个例子:

# Compute partial sums in a list comprehension
total = 0
values = [1, 2, 3, 4, 5]
partial_sums = [total := total + v for v in values]
# [1, 3, 6, 10, 15]
print(f"Total: {total}")  # Total: 15

注意,对于理解,变量 total不是本地人(第一个例子中的 comment也是 不是本地人)。命名表达式中的 NAME不能是表达式中的局部变量,因此,例如,[i := 0 for i, j in stuff]将是无效的,因为 i 是列表内涵的局部变量。

我已经从 PEP 572文档中选取了例子-这是一个很好的阅读!一旦我的公司从 Python 3.6升级,我期待着使用命名表达式。希望这对你有帮助!

资料来源: 面向数据科学的文章PEP 572