我正在阅读Miller和Ranum关于使用Python的算法和数据结构的书。他们使用下面的示例:Python中的变量重新分配 - 本体查询 - 使用牛顿方法
def squareroot(n):
root = n/2
for k in range(20):
root = (1/2)*(root + n/root)
return root
我的问题是,可变“根”被一个for循环中重新分配,使得每次迭代“根”的表达式中的分配的权值操作员更改。我不确定我是否明白这是可能的。
一旦进行函数调用,for循环(第2行)外部的'root'变量计算为一个值,然后由for循环表达式中的'root'变量引用块,允许表达式求值为单个值,该值在for-loop块中重新分配给赋值运算符左侧的变量“root”。在下一次迭代开始时,'root'不再是n/2,但for循环中的表达式已经评估过的任何值。在这种情况下,变量'root'已被重新赋值为float值,因此不再是最初定义的值 - 使用'root'变量的表达式。例如,如果我们使用函数调用squareroot(9),'root'将在第一次迭代后保持3.25的值,因为for-loop中的表达式评估为该值。一旦for循环中的变量'root'被重新分配了一个浮点值,原来定义为'root'的表达式被销毁。 '根'已被重新定义为3.25。 for循环中的'root'不再引用表达式,而是引用单个浮点值。然而,似乎在这个例子中,for循环中的'root'变量在每次迭代之后有两个含义:它既是浮点值又是表达式。我不明白这是怎么回事。
正如你所理解的,变量“作为浮点值”和“作为表达式”有什么区别? – mwchase
变量从不“引用表达式”。它们是指评估该表达式的*值*。因此,例如,执行'root = n/2'的时刻,'root'保存一个特定的数值,恰好是当时'n'的一半;与'n'的值没有持续的联系。 – jasonharper