summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2003-04-14 20:58:14 (GMT)
committerGuido van Rossum <guido@python.org>2003-04-14 20:58:14 (GMT)
commit3a3cca5b820084d759b06aed84b1070a56786af5 (patch)
tree81809e367df89b0dbb4255be3316b7083ca31e45
parentb43f15e1ce34deac45eb173db5f12d3d979cf08e (diff)
downloadcpython-3a3cca5b820084d759b06aed84b1070a56786af5.zip
cpython-3a3cca5b820084d759b06aed84b1070a56786af5.tar.gz
cpython-3a3cca5b820084d759b06aed84b1070a56786af5.tar.bz2
- 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.
-rw-r--r--Doc/lib/libstdtypes.tex9
-rw-r--r--Lib/test/test_types.py5
-rw-r--r--Misc/NEWS5
-rw-r--r--Objects/listobject.c7
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; )