给定列表:
x = [x for x in range(10)]
打印索引和值:
for i in range(-10, len(x)):
print i, ": ", x[i]
输出结果为:
-10 : 0
-9 : 1
-8 : 2
-7 : 3
-6 : 4
-5 : 5
-4 : 6
-3 : 7
-2 : 8
-1 : 9
0 : 0
1 : 1
2 : 2
3 : 3
4 : 4
5 : 5
6 : 6
7 : 7
8 : 8
9 : 9
但
print x
返回:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
为什么实际列表的长度是初始化列表的两倍?
答案 0 :(得分:12)
您正在使用否定索引。那些工作也是;在Python中一个索引<最后的0个索引。所以索引元素有两种不同的方式,从开始和结束开始计算。
例如,索引2
和-8
都引用x
中的第3个元素,因此两个索引都会为您提供值2
。
因此,列表的长度不是两倍,您只需打印两次值;一次为负面指数,再一次为正面。
请参阅sequence types operations table下的说明#3:
- 如果 i 或 j 为负数,则索引相对于字符串的结尾:
醇>len(s) + i
或len(s) + j
被替换。但请注意,-0
仍为0
。
或来自Introduction section of the Python tutorial:
指数也可能是负数,从右边开始计算:
>>> word[-1] # last character 'n' >>> word[-2] # second-last character 'o'
答案 1 :(得分:6)
Python支持负索引以及访问列表元素的正索引。
在负索引中,从列表末尾向后计数访问元素。
所以,
索引-1
处的元素基本上是列表的最后一个元素,即索引9
处的元素
索引-2
处的元素是第二个元素,即索引8
处的元素
..
..
索引-10
处的元素是第一个元素,即索引0
的元素。
您的列表大小不是两倍。您只是打印出相同的元素两次,因为它们是同一个对象,您只是使用两种不同的方式来访问同一个对象。
您可以使用is
运算符检查它们是否相同。
>>> x[0] is x[-10] # Both point to the same object
True
>>> x[1] is x[-9] # Both point to the same object
True
...
...
>>> x[9] is x[-1] # Both point to the same object
True
答案 2 :(得分:0)
python中的10个元素的数组,
x of index 0 1 2 3 4 5 6 7 8 9
= x of index -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
请参阅python 2.7 documentation tutorial
在您的代码中:
for i in range(-10, len(x)):
print i, ": ", x[i]
我会从-10运行到len(x)-1,详细信息= -10,-9,-8,-7,-6,-5,-4,-3,-2, - 1,0,...,9。
总共有20次迭代,这就解释了为什么你得到两倍len(x)。
我想你想要的是:
for i in range(-len(x), 0):
print i, ": ", x[i]
这将给出正常大小= len(x)。