Index: Objects/listobject.c =================================================================== --- Objects/listobject.c (revision 73521) +++ Objects/listobject.c (working copy) @@ -2328,6 +2328,29 @@ return NULL; } +static PyObject * +listswap(PyListObject *self, PyObject *v) +{ + PyListObject *vl, tmp; + if (!PyList_Check(v)) { + PyErr_SetString(PyExc_TypeError, "list.swap(x): x must be a list"); + return 0; + } + vl = (PyListObject *)v; + tmp.ob_size = self->ob_size; + tmp.ob_item = self->ob_item; + tmp.allocated = self->allocated; + + self->ob_size = vl->ob_size; + self->ob_item = vl->ob_item; + self->allocated = vl->allocated; + + vl->ob_size = tmp.ob_size; + vl->ob_item = tmp.ob_item; + vl->allocated = tmp.allocated; + Py_RETURN_NONE; +} + static int list_traverse(PyListObject *o, visitproc visit, void *arg) { @@ -2478,6 +2501,8 @@ PyDoc_STRVAR(sort_doc, "L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;\n\ cmp(x, y) -> -1, 0, 1"); +PyDoc_STRVAR(swap_doc, +"L.swap(list) -- swap the contents of L with list"); static PyObject *list_subscript(PyListObject*, PyObject*); @@ -2494,6 +2519,7 @@ {"count", (PyCFunction)listcount, METH_O, count_doc}, {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc}, {"sort", (PyCFunction)listsort, METH_VARARGS | METH_KEYWORDS, sort_doc}, + {"swap", (PyCFunction)listswap, METH_O, swap_doc}, {NULL, NULL} /* sentinel */ };