为什么列表的大小是其两倍?

时间:2015-07-11 16:12:49

标签: python python-2.7

给定列表:

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]

为什么实际列表的长度是初始化列表的两倍?

3 个答案:

答案 0 :(得分:12)

您正在使用否定索引。那些工作也是;在Python中一个索引<最后的0个索引。所以索引元素有两种不同的方式,从开始和结束开始计算。

例如,索引2-8都引用x中的第3个元素,因此两个索引都会为您提供值2

因此,列表的长度不是两倍,您只需打印两次值;一次为负面指数,再一次为正面。

请参阅sequence types operations table下的说明#3:

  
      
  1. 如果 i j 为负数,则索引相对于字符串的结尾:len(s) + ilen(s) + j被替换。但请注意,-0仍为0
  2.   

或来自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)。