Python:列表的两个索引位置括号

Python:列表的两个索引位置括号,python,indexing,Python,Indexing,为什么它会打印3 这是如何评估的?它是否首先从索引1获取列表1的元素:然后获取该元素的索引1?指定如何计算它,因为它构造了程序的语法树 在不深入技术细节的情况下,这种索引是递归的。这意味着: list1 = [1, 2, 3, 4] element = list1[1:][1] print(element) 缩写为: foo[bar][qux] 所以这些指数是从左到右计算的 评估结果如下: (foo[bar])[qux] (当然,实际上没有创建temp变量,但列表本身是存储在内存

为什么它会打印3

这是如何评估的?它是否首先从索引1获取列表1的元素:然后获取该元素的索引1?

指定如何计算它,因为它构造了程序的语法树

在不深入技术细节的情况下,这种索引是递归的。这意味着:

list1 = [1, 2, 3, 4]  
element = list1[1:][1]   
print(element)
缩写为:

foo[bar][qux]
所以这些指数是从左到右计算的

评估结果如下:

(foo[bar])[qux]
(当然,实际上没有创建
temp
变量,但列表本身是存储在内存中的真实对象,因此也可能更改状态等)


首先,我们从第二项开始切片,这将产生一个列表,然后我们得到该列表的第二项,因此,python从左到右进行计算。您不明白哪一部分,
[1:
[1]
?我认为您认为列表1[1://code>是
[3,4]
,而事实并非如此。
[1://code>是列表的一部分,从索引1开始,一直到列表的末尾(索引通常从零开始)。这样就产生了
[2,3,4]
,然后你用
[1]
请求列表的中间元素,即
3
。回想一下,列表索引从
0
开始。感谢您的解释,非常有用!当然,在现实中,没有创建任何临时变量——它是被创建的,但没有绑定到任何东西,因此在语句末尾就不可用了。@JonClements:我认为它没有创建变量,只是创建了一个累加器。例如,您无法检查调用堆栈并将中间结果作为(命名)标识符查看。@WillemVanOnsem nope。。。一个新的列表是通过切片创建的,所以如果你有一个1000个元素的列表,你可以创建一个包含999个元素的新列表,然后索引到那个列表中。。。999列表不受任何约束,因此可以在语句末尾进行垃圾收集。。。但它仍然被创造了…@JonClements:是的,但我认为这是一个对象,而不是一个变量。一个变量——基于我在计算机科学课上的学习方式——是一个“与值相关联的符号名”。
list1 = [1, 2, 3, 4]
temp = list1[1:]    # create a sublist starting from the second item (index is 1)
element = temp[1]   # obtain the second item of temp (index is 1)