0

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

 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 个元素中,但它会发生变化。希望这不是措辞太可怕..

4

1 回答 1

1

问题是您只创建了一个lightMultList. 您反复清除它(使用del lightMultList[:])并重新填充它,然后一遍又一遍地将相同的内容附加到lightList.

简单的解决方法是lightMultList每次都创建一个新的。你可以通过改变这一行来做到这一点:

del lightMultList[:]

… 至:

lightMultList = []

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

此外,C++ 程序员可能会尝试通过尝试重用相同的临时对象来避免浪费地创建所有这些临时对象来优化性能,但在 Python 中,创建新列表的成本与迭代一步的成本大致相同首先结束listUser。如果担心速度太慢,您将不得不重新组织代码或将整个代码移至 C 或 Cython;这不会有帮助。(话虽这么说,它在 C++ 中也很少是有用的优化;在极少数重要的情况下,正确的做法是在包含向量中就地构造新向量……)

于 2013-10-22T18:18:14.020 回答