Python列表附加了可变变量

时间:2013-10-22 18:03:48

标签: python list variables append mutable

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

 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 个答案:

答案 0 :(得分:1)

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

简单的解决方法是每次只创建一个新的lightMultList。您可以通过更改此行来执行此操作:

del lightMultList[:]

......来:

lightMultList = []

这种问题通常是试图直接移植C或C ++代码,或者只是用C ++思考。如果你期望lightList.append(lightMultList)调用“复制构造函数”,那就是根本问题:Python中没有这样的东西。为变量赋值,将其附加到列表等,不会复制任何内容;它只是将另一个引用绑定到相同的值。

此外,C ++程序员可能会尝试通过尝试重用相同的临时对象来避免浪费地创建所有这些临时对象来尝试优化性能,但在Python中,创建新列表的成本与成本相同。首先在listUser上迭代一步。如果它足够慢而无法担心,那么你将不得不重组你的代码或将整个事情移动到C或Cython;这没有用。 (话虽如此,它在C ++中也很少有用;在极少数情况下,在那里做的正确的事情就是在包含的向量中就地构造新的向量...)