【发布时间】:2015-11-24 02:31:04
【问题描述】:
我今天遇到了一段代码,促使我编写了这个小函数:
def strangeloop(n):
for n in range(1, n):
print n
strangeloop(10) 最终打印了从 1 到 9 的数字。我的问题是,为什么循环变量与参数不冲突?
【问题讨论】:
-
请注意,重载指的是函数,而不是变量。变量被覆盖。 :)
我今天遇到了一段代码,促使我编写了这个小函数:
def strangeloop(n):
for n in range(1, n):
print n
strangeloop(10) 最终打印了从 1 到 9 的数字。我的问题是,为什么循环变量与参数不冲突?
【问题讨论】:
for 循环将值分配给其循环变量,就像任何其他分配一样。您可以出于同样的原因编写代码:
x = 2
x = 3
后面的赋值只会覆盖前面的赋值。在您的情况下,循环变量会覆盖函数参数。
请注意,range(1, n) 在循环开始之前被评估一次。所以当时它指的是函数参数。一旦发生这种情况,第一个循环值被分配给n,然后函数参数被覆盖并且不再可访问。循环一旦循环就不再“需要”函数参数。
【讨论】:
答案是range(1, n)创建了一个范围对象,当for循环将n设置为范围内的值时,函数参数n被覆盖并不重要。
这段代码运行良好可能并不令人惊讶,而且它的运行原因相同:
def strangeloop(n):
r = range(1, n):
for n in r:
print n
n 的值是传入范围的值,而不是变量本身,因此范围对象看不到变量n 已更改。
【讨论】:
Pythons for 循环的工作方式与 c for 循环不同。
range 不会将运行变量与其参数进行比较。
它返回数字列表 (python2) 或 yields 这些数字的生成器。
for 循环随后将一个又一个元素分配给运行变量。
python2:
>>> l = range(5)
>>> l
[0, 1, 2, 3, 4]
python3:
>>> g = range(5)
>>> g
range(0, 5)
>>> list(g)
[0, 1, 2, 3, 4]
【讨论】: