Python 术语中“运算符”的定义,以及扩展的“操作数”

Definition of "operator", and by extension "operand", in Python terminology

提问人:Johan Falkenjack 提问时间:11/9/2023 更新时间:11/9/2023 访问量:37

问:

这句话正确吗?

fot += [duk]是 Python 中的赋值,实际上是
和 不是操作数的缩写,
但是,它们是
fot = fot + [duk]fot[duk]fot += [duk]fot + [duk]

背景:

我目前在一门使用 Python 作为教学语言的入门编程本科课程中担任讲师。我正在浏览一些材料,内容涉及他们过去几年在这门课程中所做的关于编程术语的教学练习。上面的引文来自学生在前几年练习中犯的常见错误列表。我从瑞典语原文翻译过来,并添加了强调和格式。

在 Python 中被称为增强赋值运算符之一,在我看来,如果某物是运算符,那么它所操作的任何东西都是操作数。J.F. 以上是运算符的操作数。然而,自从我从更正式的角度学习编程语言课程以来,已经有 15 年了,所以我可能忘记了很多在这种情况下重要的细节。主要是,我认为赋值是一个语句可能会影响我们如何定义运算符操作数,但我基本上是在这方面猜测。+=fot[duk]+=

我迄今为止的研究

我开始深入研究 Python 语言参考,我认为上面引用的原因可以在第 2.5 节中找到,该节涵盖了词法分析并列出了在该上下文中定义为运算符的标记集。该列表不包括(也不包括常规赋值运算符)。相反,它们列在涵盖分隔符的第 2.6 节中。(但是,本节确实称为“增强赋值运算符”,因此它已经变得混乱了。+==+=

此外,在第 7.2 节中,涵盖赋值语句,隐含地称为“赋值运算符”。仔细阅读 [第 7.2.1 节],其中专门介绍了增强分配,其中包含以下引述 [强调我的]:=

增强赋值计算目标(与普通赋值语句不同,它不能是解包)和表达式列表,对两个操作数执行特定于赋值类型的二进制运算,并将结果分配给原始目标。目标仅评估一次。

这句话似乎加强了我的观点。它在 的上下文中显式使用单词操作数。但是,它可以被解释为两个标记是“特定于赋值类型的二进制运算”的操作数,而不是增强赋值本身的操作数。这甚至可能就是原文引文的第三行所说的。+=

巧合的是,进一步阅读第 7.2.1 节会发现,无论第 2 行和第 3 行如何,上面引文的第一行都不太正确。

与普通作业不同,增强作业先评估左侧,然后再评估右侧。

J.F. 不是简单的一个扩展为的宏,它实际上语义略有不同。fot += [duk]fot = fot + [duk]

一种猜测是,无论谁写了上面的原始引文,都只看了第 2.5 节,并指出它不在标记化上下文中的运算符列表中,并且/或记住它通常不被视为数学中的运算符,并停在那里。但是,我浏览了多个部分并搜索了对“运算符”和“操作数”的引用,但我仍然不确定。不过,我绝对没有阅读整个 Python 语言参考。在 的上下文中,可能还有其他因素会影响 和 作为操作数的状态,或者不影响 。+==fot[duk]fot += [duk]

你的想法?

Python 计算机科学 术语 形式语言 操作数

评论

2赞 MegaIng 11/10/2023
这种区别的意义何在? 是赋值运算符(即不是表达式运算符)。为什么它的参数在哪里被称为操作数很重要?也就是说,如果它们不是操作数,会有什么影响?值得一提的是,这不是 的简写,这是我所知道的最常见的错误之一。+=a += aa = a + b
1赞 chepner 11/10/2023
的真正语义基本上如下:如果被定义,则等价于 ;否则,它将回退到 。x += yx.__iadd__x = x.__iadd__(y)x = x.__add__(y)
2赞 Barmar 11/10/2023
如果你问如何向学生解释这一点,计算机科学教育工作者可能是一个更好的问题。这不是日常编程中需要做出的区分。
1赞 Barmar 11/10/2023
我怀疑你要寻找的区别是在语句和表达式之间。在 Python 中,赋值是语句,而不是表达式,所以 和 不是运算符,就像 和 一样。它们更接近关键字,例如 和 。=+===+fordef
1赞 wjandrea 11/10/2023
另请参阅:“各种赋值运算符(=+= 等)[...]不是真正的运算符,而是赋值语句中的句法分隔符。

答: 暂无答案