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

Ste*_*nko 1 python python-2.7

给定列表:

x = [x for x in range(10)]
Run Code Online (Sandbox Code Playgroud)

打印出索引和值:

for i in range(-10, len(x)):
    print i, ": ", x[i]
Run Code Online (Sandbox Code Playgroud)

输出是:

-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
Run Code Online (Sandbox Code Playgroud)

print x
Run Code Online (Sandbox Code Playgroud)

收益:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 12

您正在使用负面索引.那些工作也是; 在Python中,索引<0索引从最后开始.因此,有两种不同的索引元素的方式,从开始和结束计算.

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

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

请参阅序列类型操作表下的注释#3 :

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

或者从Python教程的" 简介"部分:

指数也可能是负数,从右边开始计算:

>>> word[-1]  # last character
'n'
>>> word[-2]  # second-last character
'o'
Run Code Online (Sandbox Code Playgroud)


Rah*_*pta 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
Run Code Online (Sandbox Code Playgroud)

  • 是的,但如果您有两个具有相同值的不同对象,则无效.如果`a = [1,2,3]`和`b = a`,那么`b是[:]`是假的但是`b == a [:]`是真的.http://stackoverflow.com/questions/132988/is-there-a-difference-between-and-is-in-python (2认同)
  • `lst = [1,1,1]; lst [0]是lst [1] - > True; lst [1]是lst [2] - > True`.这两个索引对Python来说意味着同样的事情****两个索引指向同一个对象是两个不同的东西. (2认同)