2024-04-26 22:24:49 发布
网友
今天我有一些空闲时间,我开始玩一点Python。我试着运行一段看似简单的代码,如下所示:
a = [] for i in range(10): a.append(i * ++i) for a[i] in a: print(a[i])
现在,正如您可能预期的那样,明显的输出应该是这样的:
0 1 4 9 16 25 36 49 64 81
但事实并非如此。当我运行它时,我得到的是:
0 1 4 9 16 25 36 49 64 64
这是怎么回事?你知道吗
我们把它拆成碎片吧。你知道吗
a = []
空名单初始化,到目前为止,还不错。你知道吗
for i in range(10): a.append(i * ++i)
这里有两个错误。首先,++i是+(+i),这本质上不是操作。其次,在for循环体中对i名称所做的任何更改都不会保留到下一次迭代。你知道吗
++i
+(+i)
i
for o in seq本质上是这样的:
for o in seq
在每个循环开始时
a)指针递增到下一个元素
b)该元素的值被赋给o
o
所以在这一步中,在每次迭代的开始时range(10)被要求输入下一个数字,并且i = THAT_NEXT_NUMBER赋值被完成。你知道吗
range(10)
i = THAT_NEXT_NUMBER
现在让我们进入第二个怪圈:
for a[i] in a: print(a[i])
我们知道在第一个循环之后i是9(最后一个赋值给name i),而a是[0, 1, 4, 9, 16, 25, 46, 49, 64, 81]。你知道吗
a
[0, 1, 4, 9, 16, 25, 46, 49, 64, 81]
由于for循环本质上是上面描述的“ask and assign”,因此逐步操作是:
a[i]
a[9]
[0, 1, 4, 9, 16, 25, 46, 49, 64, 0]
0
[0, 1, 4, 9, 16, 25, 46, 49, 64, 1]
1
[0, 1, 4, 9, 16, 25, 46, 49, 64, 64]
64
这就是你的结果。你知道吗
当您想打印a时,您应该:
for element in a: print(element)
你的代码的问题是
for a[i] in a
每次循环运行时覆盖a[i]。i = 9因为它来自第一个循环。因此,第二个循环正确地打印所有内容,同时将该值赋给a[9]这就是为什么在循环结束时,最后一个元素又是64。你知道吗
i = 9
Python没有++操作符。++i只是一元+运算符的两倍,这是不可操作的
++
+
这真是个奇怪的循环。它把for…in语法和索引混为一谈。循环浏览列表的典型方法是:
for
in
for item in a: print(item)
至于为什么用原始代码打印两次64:when the first loop finishedi是9。因此,第二个循环相当于:
for a[9] in a: print(a[9])
对于列表a中的每个元素,它将该元素分配到a中的最后一个位置(比如说什么?),然后打印最后一个元素。它的工作原理与for item in a循环基本相同,直到到达终点,这时幻影扭曲的脸才显露出来。你知道吗
for item in a
因为它一直被赋值给a[9],a[9]并没有保留它原来的值81。当你到达终点时,它被上一个值64覆盖了。这就是为什么64要打印两次。你知道吗
我们把它拆成碎片吧。你知道吗
空名单初始化,到目前为止,还不错。你知道吗
这里有两个错误。首先,
++i
是+(+i)
,这本质上不是操作。其次,在for循环体中对i
名称所做的任何更改都不会保留到下一次迭代。你知道吗for o in seq
本质上是这样的:在每个循环开始时
a)指针递增到下一个元素
b)该元素的值被赋给
o
所以在这一步中,在每次迭代的开始时
range(10)
被要求输入下一个数字,并且i = THAT_NEXT_NUMBER
赋值被完成。你知道吗现在让我们进入第二个怪圈:
我们知道在第一个循环之后
i
是9(最后一个赋值给namei
),而a
是[0, 1, 4, 9, 16, 25, 46, 49, 64, 81]
。你知道吗由于for循环本质上是上面描述的“ask and assign”,因此逐步操作是:
a[i]
,即a[9]
,转到for循环体。列表为:[0, 1, 4, 9, 16, 25, 46, 49, 64, 0]
,打印值为a[i]
=a[9]
=0
a[i]
,即a[9]
,转到for循环体。列表为:[0, 1, 4, 9, 16, 25, 46, 49, 64, 1]
,打印值为a[i]
=a[9]
=1
a[i]
,即a[9]
,转到for循环体。列表为:[0, 1, 4, 9, 16, 25, 46, 49, 64, 64]
,打印值为a[i]
=a[9]
=64
a[i]
,即a[9]
,转到for循环体。列表为:[0, 1, 4, 9, 16, 25, 46, 49, 64, 64]
(列表中的第9个元素替换为列表中的第9个元素),打印值为a[i]
=a[9]
=64
。你知道吗这就是你的结果。你知道吗
当您想打印
a
时,您应该:你的代码的问题是
每次循环运行时覆盖
a[i]
。i = 9
因为它来自第一个循环。因此,第二个循环正确地打印所有内容,同时将该值赋给a[9]
这就是为什么在循环结束时,最后一个元素又是64
。你知道吗Python没有
++
操作符。++i
只是一元+
运算符的两倍,这是不可操作的这真是个奇怪的循环。它把
for
…in
语法和索引混为一谈。循环浏览列表的典型方法是:至于为什么用原始代码打印两次64:when the first loop finished
i
是9。因此,第二个循环相当于:对于列表
a
中的每个元素,它将该元素分配到a
中的最后一个位置(比如说什么?),然后打印最后一个元素。它的工作原理与for item in a
循环基本相同,直到到达终点,这时幻影扭曲的脸才显露出来。你知道吗因为它一直被赋值给
a[9]
,a[9]
并没有保留它原来的值81。当你到达终点时,它被上一个值64覆盖了。这就是为什么64要打印两次。你知道吗相关问题 更多 >
编程相关推荐