]> granicus.if.org Git - python/commitdiff
- list.insert(i, x) now interprets negative i as it would be
authorGuido van Rossum <guido@python.org>
Mon, 14 Apr 2003 20:58:14 +0000 (20:58 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 14 Apr 2003 20:58:14 +0000 (20:58 +0000)
  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
Lib/test/test_types.py
Misc/NEWS
Objects/listobject.c

index 469b9d3824fe79083351e419a8b642185a4d867d..f9e6566fc1e72cf9b9a111242749e49d4e4c5c87 100644 (file)
@@ -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},
index f2a7ccdeb5be02cb02f6c73a103f9f965198056e..49f58e07cca04fdb6461cad06b61267e848bc541 100644 (file)
@@ -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)
index 054559bb346ad92168df8be78412bcf204b48121..438e619e6b01613e88f3cbe7cb3075bf89f1f779 100644 (file)
--- 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:
index 6228e645dbf8d0c141ba5f567174525fb48bad73..047c6ec98900cd2b33044268b9c284b99f2b335f 100644 (file)
@@ -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; )