附加到元组覆盖以前的值

时间:2012-05-30 11:13:38

标签: python append tuples arcpy

我正在使用arcpy来获取形状文件的所有折线。 SearchCursor返回一个游标,以便我可以迭代shape文件的所有功能。问题是我想保存游标返回的所有对象供以后使用。

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

元组应该包含游标返回的所有对象。但它只有最后一个元素重复size元组次数。

  

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

首先,我尝试使用此列表。当我使用'append()'方法时,也找到了相同的输出列表。由于元组是不可变数据结构,+如何覆盖元组的所有先前元素。虽然这段代码是为arcpy编写的,但我猜这个问题不是特定于arcgis的。

2 个答案:

答案 0 :(得分:4)

这表明row.getValue()不断将引用返回到同一个对象,它会不断更新。

要验证,请尝试在第一个循环中打印id(feat)id(feat.firstPoint)id(feat.lastPoint),并查看迭代之间是否有任何ID保持不变。如果他们中的任何一个做了,那就是你的问题。

  

由于元组是不可变数据结构,如何+覆盖元组的所有先前元素。

没有。元组是不可变的,因为你不能在不创建新元组的情况下添加或删除元素。您也无法更改元组元素的值。但是,如果该元素是对可变对象的引用,则可以自由修改对象本身。这是我怀疑在这里发生的事情:你有多个对同一个对象的引用;当你修改一个时,它们似乎都会改变。

答案 1 :(得分:0)

您可以将此作为一行列表理解:

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")

feature_list = [row.getValue( shapefieldname ) for row in rows]

在此示例中,“feature_list”将是您的形状字段值的列表。