以下是我正在运行的一些示例代码:
#!/usr/bin/python
x=[]
for i in range(0,20):
x.append(i)
y=[]
for i in x:
y.append(-1*x[i])
for i in y:
print i, y[i]
预期输出为:
0 0
1 -1
2 -2
3 -3
4 -4
5 -5
6 -6
7 -7
8 -8
9 -9
10 -10
11 -11
12 -12
13 -13
14 -14
15 -15
16 -16
17 -17
18 -18
19 -19
相反,我得到:
0 0
-1 -19
-2 -18
-3 -17
-4 -16
-5 -15
-6 -14
-7 -13
-8 -12
-9 -11
-10 -10
-11 -9
-12 -8
-13 -7
-14 -6
-15 -5
-16 -4
-17 -3
-18 -2
-19 -1
为什么会这样?
答案 0 :(得分:3)
您可以使用enumerate获取所需的输出:
for i,val in enumerate(y):
print (i, val)
您的问题是for i in y
为您提供了y中的实际元素。然后在打印y [i]时使用这些作为索引。当你使用负数作为指数时,它会从列表末尾向后计数(因此y [-1]是列表中的最后一个值,y [-2]是倒数第二个,等等。)
答案 1 :(得分:1)
for i in y:
print i, y[i]
打印i(来自y)和y [1],它们也访问y。我想你想要:
for i in x:
print i, y[i]
如果有趣的话要注意,因为你的原始代码是将负数作为y的索引(即y [-1]),所以它从结尾获取元素并向后移动。乐趣。
答案 2 :(得分:1)
for i in y
不生成索引。它生成已存储在y
中的数字,范围从0到-19。这些负面索引然后重新应用到y
为您提供从列表末尾开始计算的索引。
换句话说,在第一次迭代中,y[0]
为0
并打印0, 0
。第二次迭代y[1]
为-1
,y[-1]
,y
中的最后一个元素为-19
,因为当使用负索引时,列表的长度被添加到索引中,因此打印-1 -19
。等
将索引与列表值一起打印的Pythonic方法是使用enumerate()
;像这样:
for i, value in enumerate(y):
print i, value
但你也可以做到:
for i in range(len(y)):
print i, y[i]
答案 3 :(得分:0)
问题是由于在最后一个循环中for i in y
,i
分配了每个值,而不是索引。因此,i
被分配了-1
,-2
,...,-19
等等。访问列表的负索引-i
将返回从列表后面开始计算的第i个元素。
即
>>> [1, 2, 3, 4, 5, 6][-1]
6
>>> [1, 2, 3, 4, 5, 6][-4]
3
答案 4 :(得分:0)
试试这个(对最后一行进行更改):
x=[]
for i in range(0,20):
x.append(i)
y=[]
for i in x:
y.append(-1*x[i])
for i in y:
print x[-i], y[-i]
答案 5 :(得分:0)
意外输出是由最后一个循环引起的。
for i in y:
我正在循环y的值,这是您在第一列中看到的值
因为在这个循环中i的值是负数,所以你将得到从最后开始的索引,从-1开始等于最后一个元素,-2是倒数第二个,等等。当然零索引是非-ngative和索引从数组的开头
获取i的值,你期望你可以遍历x []中的值或y中的索引值范围
for i in x:
print i, y[i]
或
for i in range(0,len(y)):
print i, y[i]