Appending to a tuple overwriting previous values

append, arcpy, python, tuples

Solution

What this suggests is that `row.getValue()` keeps returning references to the same object, which it keeps updating in place.

To verify, try printing `id(feat)`, `id(feat.firstPoint)` and `id(feat.lastPoint)` in the first loop, and see whether any of the ids remain the same between iterations. If any of them do, that's your problem.

As tuple is immutable data structure, how can + overwrites all the previous elements of tuple.

It doesn't. Tuple is immutable in the sense that you can't add or remove elements from it without creating a new tuple. You also can't change the value of a tuple element. However, if that element is a reference to a mutable object, you are free to modify the object itself. This is what I suspect is happening here: you have multiple references to the same object; when you modify one, they all appear to change.

Problem

I'm using arcpy to get all the polylines of a shape file. `SearchCursor` returns a cursor so that I can iterate over all the features of shape file. Problem is I want to save all the objects returned by cursor for later use. ``` import arcpy from arcpy import env env.workspace = r"C:\GIS Data\GIS data" desc = arcpy.Describe("River.shp") shapefieldname = desc.ShapeFieldName rows = arcpy.SearchCursor("River.shp") featureList = () for row in rows: feat = row.getValue(shapefieldname) featureList = featureList + (feat, ) print "%i %i" % (featureList[-1].firstPoint.X, featureList[-1].firstPoint.Y) print "%i %i" % (featureList[-1].lastPoint.X, featureList[-1].lastPoint.Y) print print "---------------------------------------------------------------" for feat in featureList: print "%i %i" % (feat.firstPoint.X, feat.firstPoint.Y) print "%i %i" % (feat.lastPoint.X, feat.lastPoint.Y) print ``` Tuple supposed to contain all the objects returned by cursor. But it has only the last elements repeated `size` of tuple number of times. 3610930 2135882 3611593 2134453 3611806 2134981 3611593 2134453 3614160 2136164 3617432 2131734 3611593 2134453 3617432 2131734 3617432 2131734 3620568 2127591 3620568 2127591 3620785 2127423 3617980 2126657 3620568 2127591 3616768 2129454 3617948 2126649 3617948 2126649 3617980 2126657 3615102 2128889 3617587 2126510 3617587 2126510 3617948 2126649 3617624 2126416 3617980 2126657 3613129 2128176 3615155 2125617 3615155 2125617 3617587 2126510 3615086 2125515 3615155 2125617 3615086 2125515 3615155 2125617 3615086 2125515 3615155 2125617 3615086 2125515 3615155 2125617 3615086 2125515 3615155 2125617 3615086 2125515 3615155 2125617 3615086 2125515 3615155 2125617 3615086 2125515 3615155 2125617 3615086 2125515 3615155 2125617 3615086 2125515 3615155 2125617 3615086 2125515 3615155 2125617 3615086 2125515 3615155 2125617 3615086 2125515 3615155 2125617 3615086 2125515 3615155 2125617 3615086 2125515 3615155 2125617 3615086 2125515 3615155 2125617 At first, I've tried this using list. Same output was also found for list when I've used 'append()' method. As tuple is immutable data structure, how can `+` overwrites all the previous elements of tuple. Although this code is written for arcpy, but I guess the problem isn't arcgis specific.

Original source