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.
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)andid(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.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.