2024-05-14 12:52:20 发布
网友
今天我遇到一段代码,促使我编写了这个小函数:
def strangeloop(n): for n in range(1, n): print n
奇怪循环(10)最后打印出从1到9的数字。我的问题是,为什么循环变量与参数不冲突?你知道吗
Pythonsfor循环的工作方式不同于cfor循环。 range不将正在运行的变量与其参数进行比较。 它返回一个数字列表(python2)或一个生成这些数字的生成器。你知道吗
for
range
然后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]
一个for循环给它的循环变量赋值,就像其他赋值一样。执行代码的原因与执行此操作的原因相同:
x = 2 x = 3
后面的作业只是覆盖了前面的作业。在您的例子中,循环变量覆盖函数参数。你知道吗
注意,range(1, n)在循环开始之前计算一次。所以当时它指的是函数参数。一旦发生这种情况,第一个循环值被分配给n,然后函数参数被覆盖,不再可访问。循环在循环时不“需要”函数参数。你知道吗
range(1, n)
n
答案是range(1, n)创建了一个range对象,当for循环将n设置为range中的值时,覆盖函数参数n并不重要。你知道吗
这段代码运行良好可能就不那么令人惊讶了,原因也是一样的:
def strangeloop(n): r = range(1, n): for n in r: print n
n的值是传递给range的值,而不是变量本身,因此range对象看不到变量n已经更改。你知道吗
Pythons
for
循环的工作方式不同于cfor
循环。range
不将正在运行的变量与其参数进行比较。 它返回一个数字列表(python2)或一个生成这些数字的生成器。你知道吗然后
for
循环将一个又一个元素分配给正在运行的变量。你知道吗Python2:
Python3:
一个
for
循环给它的循环变量赋值,就像其他赋值一样。执行代码的原因与执行此操作的原因相同:后面的作业只是覆盖了前面的作业。在您的例子中,循环变量覆盖函数参数。你知道吗
注意,
range(1, n)
在循环开始之前计算一次。所以当时它指的是函数参数。一旦发生这种情况,第一个循环值被分配给n
,然后函数参数被覆盖,不再可访问。循环在循环时不“需要”函数参数。你知道吗答案是
range(1, n)
创建了一个range对象,当for循环将n
设置为range中的值时,覆盖函数参数n
并不重要。你知道吗这段代码运行良好可能就不那么令人惊讶了,原因也是一样的:
n
的值是传递给range的值,而不是变量本身,因此range对象看不到变量n
已经更改。你知道吗相关问题 更多 >
编程相关推荐