From 3a3cca5b820084d759b06aed84b1070a56786af5 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 14 Apr 2003 20:58:14 +0000 Subject: - list.insert(i, x) now interprets negative i as it would be interpreted by slicing, so negative values count from the end of the list. This was the only place where such an interpretation was not placed on a list index. --- Doc/lib/libstdtypes.tex | 9 +++++---- Lib/test/test_types.py | 5 +++++ Misc/NEWS | 5 +++++ Objects/listobject.c | 7 +++++-- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/Doc/lib/libstdtypes.tex b/Doc/lib/libstdtypes.tex index 469b9d3..f9e6566 100644 --- a/Doc/lib/libstdtypes.tex +++ b/Doc/lib/libstdtypes.tex @@ -941,8 +941,7 @@ The following operations are defined on mutable sequence types (where \lineiii{\var{s}.index(\var{x})} {return smallest \var{i} such that \code{\var{s}[\var{i}] == \var{x}}}{(4)} \lineiii{\var{s}.insert(\var{i}, \var{x})} - {same as \code{\var{s}[\var{i}:\var{i}] = [\var{x}]} - if \code{\var{i} >= 0}}{(5)} + {same as \code{\var{s}[\var{i}:\var{i}] = [\var{x}]}}{(5)} \lineiii{\var{s}.pop(\optional{\var{i}})} {same as \code{\var{x} = \var{s}[\var{i}]; del \var{s}[\var{i}]; return \var{x}}}{(6)} \lineiii{\var{s}.remove(\var{x})} @@ -982,8 +981,10 @@ Notes: \var{s}. \item[(5)] When a negative index is passed as the first parameter to - the \method{insert()} method, the new element is prepended to the - sequence. + the \method{insert()} method, the list length is added, as for slice + indices. If it is still negative, it is truncated to zero, as for + slice indices. \versionchanged[Previously, all negative indices + were truncated to zero]{2.3} \item[(6)] The \method{pop()} method is only supported by the list and array types. The optional argument \var{i} defaults to \code{-1}, diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index f2a7ccd..49f58e0 100644 --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -345,6 +345,11 @@ a.insert(0, -2) a.insert(1, -1) a.insert(2,0) if a != [-2,-1,0,0,1,2]: raise TestFailed, 'list insert' +b = a[:] +b.insert(-2, "foo") +b.insert(-200, "left") +b.insert(200, "right") +if b != ["left",-2,-1,0,0,"foo",1,2,"right"]: raise TestFailed, 'list insert2' if a.count(0) != 2: raise TestFailed, ' list count' if a.index(0) != 2: raise TestFailed, 'list index' a.remove(0) diff --git a/Misc/NEWS b/Misc/NEWS index 054559b..438e619 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,11 @@ What's New in Python 2.3 beta 1? Core and builtins ----------------- +- list.insert(i, x) now interprets negative i as it would be + interpreted by slicing, so negative values count from the end of the + list. This was the only place where such an interpretation was not + placed on a list index. + - range() now works even if the arguments are longs with magnitude larger than sys.maxint, as long as the total length of the sequence fits. E.g., range(2**100, 2**101, 2**100) is the following list: diff --git a/Objects/listobject.c b/Objects/listobject.c index 6228e64..047c6ec 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -159,8 +159,11 @@ ins1(PyListObject *self, int where, PyObject *v) PyErr_NoMemory(); return -1; } - if (where < 0) - where = 0; + if (where < 0) { + where += self->ob_size; + if (where < 0) + where = 0; + } if (where > self->ob_size) where = self->ob_size; for (i = self->ob_size; --i >= where; ) -- cgit v0.12