Python/sage:可以从索引1开始列表吗?

9 python list sage

我从一个据称严肃的来源下载了一个sage脚本.它在我的计算机上不起作用,并且快速调试显示问题来自这样的事实:在某些时候,作者正在做的事情就好像n元素列表从1到n编号(而"正常"编号)在Python中(因此)sage是0..n-1).

我错过了什么?是否有一个隐藏在某处的全局变量会改变这种约定,就像在APL中一样?

感谢您的帮助(尽管我对英语和CSish都很有把握,但我希望我的问题很明确......)

jav*_*ard 6

Python(以及sage)列表总是从0开始编号,并且没有办法改变它.

在第449行的http://hg.python.org/cpython/file/70274d53c1dd/Objects/listobject.c中查看CPython的源代码:

static PyObject *
list_item(PyListObject *a, Py_ssize_t i)
{
    if (i < 0 || i >= Py_SIZE(a)) {
        if (indexerr == NULL) {
            indexerr = PyString_FromString(
                "list index out of range");
            if (indexerr == NULL)
                return NULL;
        }
        PyErr_SetObject(PyExc_IndexError, indexerr);
        return NULL;
    }
    Py_INCREF(a->ob_item[i]);
    return a->ob_item[i];
}
Run Code Online (Sandbox Code Playgroud)

项目查找直接委托给底层C数组,C数组总是从零开始.所以Python列表也总是从零开始.


小智 5

一个为您移动索引的简单类为可重用的东西提供了一个干净的接口。

class Array(object):

    def __init__(self, items: list) -> None:
        self.items = items

    def __repr__(self) -> str:
        return '{}({})'.format(self.__class__.__name__, self.items)

    def __len__(self) -> int:
        return len(self.items)

    def __contains__(self, item: any) -> bool:
        return item in self.items

    def __getitem__(self, key: int) -> any:
        return self.items[key - 1]

    def __setitem__(self, key: int, value: any) -> None:
        self.items[key - 1] = value

    def __delitem__(self, key: int) -> None:
        del self.items[key - 1]
Run Code Online (Sandbox Code Playgroud)