2013-10-22 48 views
0

还是编程/脚本编程的新手,这个人一直在困扰着我。我有一个函数可以搜索名称列表,将它与模板名称列表进行比较,当它找到匹配项时,它会按正确的顺序将它放入我的最终列表中。对于一些以后的函数能够正常工作,我需要能够将这些名称的一部分作为数组/列表附加。我遇到的问题是,每当我需要将列表添加到最终列表中时,只要我更改变量,最终列表就会随之更新。我该如何解决?Python Lists追加可变变量

light = ['template of names in here in correct order'] 
listUser = ['names gathered from user input'] 

for userChan in listUser: 
     for channelName in light: 
     #check if channelName is a list or string 

     if isinstance(channelName, basestring): 
     #search for matches in userchan 
      print channelName, 'is a string' 
      if channelName in userChan.lower(): 
       matchFound = True 
       listLight.append(userChan) 
     else: 
      print channelName, 'is a list' 
      for piece in channelName: 
       print 'searching %s in %s' %(piece, userChan.lower()) 

       if piece in userChan.lower(): 
        print "found %s in %s" %(piece, userChan.lower()) 
        lightMultList.append(piece) 
        matchFound = True 
        if len(lightMultList) == 2: 
         listLight.append(lightMultList) 
         del lightMultList[:] 

所以我的问题是与lightMultList。它总是被限制为2个元素,但它会改变。希望这不是太可怕..

+1

我可以' t安静地告诉你想要做什么,但是我的猜测是你在哪里添加了一个你想要复制的列表而不是追加实际的列表。所以'listLight.append(lightMultList [:])' – Hoopdady

+0

是的。就是这样。超级简单。谢谢 – CG7Son

+1

@ CG7Son:在这种情况下有更好的解决方案。通过清除它('del lightMultList [:]')并重新填充它来停止重用'lightMultList'。 – abarnert

回答

1

问题是,你只有创建一个lightMultList。您多次清除它(使用del lightMultList[:])并重新填充它,并将相同的内容反复附加到lightList

简单的修复方法是每次创建一个新的lightMultList。您可以通过修改这一行做:

del lightMultList[:] 

...到:

lightMultList = [] 

这种问题往往是试图直接移植C或C++代码,或者只是用C思维++的结果。如果您期待lightList.append(lightMultList)调用“复制构造函数”,那就是根本问题:Python中没有这样的东西。赋值给变量,附加到列表等等,不会复制任何东西;它只是将另一个引用绑定到相同的值。另外,C++程序员可能会尝试通过避免通过尝试重复使用同一个对象来浪费地创建所有这些临时对象来优化性能,但在Python中,创建新列表的成本与成本大致相同重复第一步listUser一步。如果它足够慢就会担心,你将不得不重新组织你的代码或者将整个东西移动到C或者Cython中;这不会有帮助。 (也就是说,它在C++中很少有用的优化;要做到这一点是正确的,在极少数情况下,在包含向量的地方构建新的向量......