Python循环追加相同的对象两次

时间:2013-11-19 19:38:57

标签: python loops

我正在关注YouTube视频Learn Python through Data Hacking,并通过添加类来学习Python OOP的所有细节来扩展“遗留”内联方式。基本上视频中的那个人你可以抓住芝加哥公交线路的路线,解析它,然后通过比较纬度,长度,时间,距离等来找到他的朋友把手提箱放在哪辆公共汽车上。

我正在使用的XML文件包含许多值,如下所示:

<bus>
    <id>1867</id>
    <rt>22</rt>

    <d>North Bound</d>
    <dd>Northbound</dd>
    <dn>N</dn>
    <lat>41.89167051315307</lat>
    <lon>-87.6297836303711</lon>
    <pid>5421</pid>
    <pd>Northbound</pd>
    <run>P258</run>
    <fs>Howard</fs>
    <op>30090</op>
    <dip>8858</dip>
    <bid>7323012</bid>
    <wid1>0P</wid1>
    <wid2>258</wid2>                
</bus>

从那里,我需要找到哪个巴士的纬度从他的位置向北(在课堂上定义,这个例子没有实际意义)。从这些节点,我正在创建一个Bus对象,如下所示:

class Bus:
    # The original XML node
    __xml = None

    # Our dictionary for properties to shadow a get() function on this object
    __tree = {}

    def __init__(self, busxml):
        self.__xml = busxml
        for e in busxml:
            self.__tree[e.tag] = busxml.findtext(e.tag)

    def gettree(self):
        return self.__tree

    # Tries to return prop, or returns None
    def get(self, prop):
        try:
            return self.__tree[prop]
        except KeyError:
            return -1
    def getall(self):
        return self.__tree

从“main”文件中,我循环遍历值并根据lat节点的文本值追加匹配:

# __getRouteData() is the url open and write function, works fine.
# parser is the xml.etree.ElementTree parse class
if self.__getRouteData() == True:
    xmlParser = parser(self.__xmlFile)
    busses = xmlParser.getnodes()

    matches = []
    # loop over all
    for busTree in busses:
        bus = Bus(busTree)

        if float(bus.get('lat')) > self.__lat:
            matches.append(bus)
            print 'appending', bus.get('id')

    for bus in matches:
        print bus.get('id')

我遇到的障碍是在上面的第二个for循环中。在第一个循环中,输出告诉我一切正常。第二个输出相同的值两次。它让我想起了Javascript for()循环的行为,其中没有闭包,只对最后一个值起作用。我从控制台输出的内容如下:

appending 1784
appending 4057
4057
4057

请注意......它告诉我它将唯一的总线附加到我的matches列表中,但是当我遍历matches列表时,它只给我一辆公共汽车。

另一个片段告诉我第二个循环的时髦之处:

print 'Matches', matches
    for bus in matches:
        print bus.get('id')
        # Matches [<busutils.Bus instance at 0xb6f92b8c>, <busutils.Bus instance at 0xb6f92d0c>]
        # 4057
        # 4057

列表的输出显示列表中对象的不同哈希值(......右?),因此说它们是两个不同的对象,因此具有不同的数据,但循环不能很好地播放

显然我刚刚进入python,但是有Java,Javascript,PHP等经验,所以我不确定在这些简单的循环中我缺少什么。

谢谢!

1 个答案:

答案 0 :(得分:2)

这是因为你在Bus类上使用了类变量。使它们成为实例变量(在__init__中创建)。