考虑你有一些表达式
i = j = 0
Run Code Online (Sandbox Code Playgroud)
假设这是用您选择的语言定义的.将它分成两个表达式通常会更好吗?
i = 0
j = 0
Run Code Online (Sandbox Code Playgroud)
我有时会在库代码中看到这一点.它在简洁性方面似乎并没有给你带来太大的好处,并且不应该比两个语句更好地执行(尽管这可能与编译器有关).那么,是否有理由使用一个而不是另一个?或者只是个人偏好?我知道这听起来像一个愚蠢的问题,但现在很长时间困扰我:-).
Guf*_*ffa 11
曾几何时存在性能差异,这是使用这种分配的原因之一.编译器会i = 0; j = 0;变成:
load 0
store [i]
load 0
store [j]
Run Code Online (Sandbox Code Playgroud)
因此,您可以通过使用来保存指令,i = j = 0因为编译器会将其转换为:
load 0
store [j]
store [i]
Run Code Online (Sandbox Code Playgroud)
如今编译器可以自己进行这种类型的优化.此外,由于当前CPU一次运行多个指令,因此无法再简单地按指令数量来衡量性能.一个操作不依赖于另一个操作的结果的指令可以并行运行,因此对每个变量使用单独值的版本实际上可能更快.
关于编程风格,您应该使用最能表达代码意图的方式.
例如,当您只想清除某些变量时,可以将分配链接起来,并在值具有特定含义时将其分配给单独的赋值.特别是如果将一个变量设置为该值的含义与将另一个变量设置为相同的值不同.
两种形式反映了作业的不同观点。
第一种情况将分配(至少是内部分配)视为运算符(返回值的函数)。
第二种情况将分配视为一条语句(执行某项操作的命令)。
在某些情况下,将赋值作为运算符很重要,这主要是为了简洁起见或在期望结果的上下文中使用。但是我感到困惑。有几个原因:
+=这样的复合任务,情况甚至更糟。尚不清楚操作员是否应返回初始值,组合结果,甚至返回其存储位置。作为语句的赋值有时会导致中间变量,但这是我看到的唯一缺点。很明显,编译器知道如何有效地优化连续的此类语句。
基本上,我会尽可能避免分配为运算符。提出的案例非常简单,并没有造成真正的混乱,但是作为一般规则,我还是希望。
i = 0
j = 0
Run Code Online (Sandbox Code Playgroud)
要么
i, j = 0, 0
Run Code Online (Sandbox Code Playgroud)
对于支持并行分配的语言。
这取决于语言。在高度面向对象的语言中,双重赋值会导致同一对象被分配给多个变量,因此一个变量的更改会反映在另一个变量中。
$ python -c 'a = b = [] ; a.append(1) ; print b'
[1]
Run Code Online (Sandbox Code Playgroud)