有人可以向我解释原因:
print(my_list[-1])
与:
相同print (my_list[len(my_list) - 1])
这是如何避免写作的捷径
len(my_list)
由于
答案 0 :(得分:4)
纯粹是因为Python将其定义为案例。负索引被视为从列表末尾(或字符串或元组)而不是从开始计数。引用the docs,引用my_list[i]
和扩展表单my_list[i:j]
和my_list[i:j:k]
:
如果
i
或j
为负数,则索引相对于字符串的结尾:len(s) + i
或len(s) + j
已被替换。但请注意-0仍为0.
实现序列协议的大多数第三方类型的行为方式相同,但请注意它们不是有义务 - 它只是内置序列的保证行为。
答案 1 :(得分:1)
支持负面索引是一个特定于对象的实现,设计列表对象的人支持它。并非所有对象都必须支持它。
您可以在listobject.c
中找到实现的位置:
static PyObject *
list_subscript(PyListObject* self, PyObject* item)
{
if (PyIndex_Check(item)) {
Py_ssize_t i;
i = PyNumber_AsSsize_t(item, PyExc_IndexError);
...
if (i < 0) // 1
i += PyList_GET_SIZE(self); // 2
return list_item(self, i); // 3
...
如果索引是否定的,它将向其添加列表大小:
if i < 0:
i += len(lst)
答案 2 :(得分:0)
执行print(my_list[-1])
时,您将打印my_list
的最后一个值。见切片的python。
执行print (my_list[len(my_list) - 1])
时,您将打印my_list
的最后一个值。
通过这种方式,您将获得len(my_list) - 1
的正整数。
虽然len(my_list)
返回my_list
中的元素数量。请注意,python中的切片表示法以0开头,len
计算以1开头的元素。
答案 3 :(得分:0)
lvc的答案很棒,但我想补充说这是一个捷径,因为
print (my_list[-1])
的缩短时间比print (my_list[len(my_list) - 1])
短,这是正确的做法。