影响不同列表的一个列表中的.pop()和.append()?

时间:2015-08-18 22:17:05

标签: python list append

我在Python中做了一些组合学的东西并且得到了一个奇怪的效果。我创建了几个列表,从一个列表弹出,将结果附加到另一个 - 但是第三个​​列表的已存在的条目以某种方式被更改。

>>> execfile('test.py')
List B's first entry: [1]
List B's first entry: [1, 5]
>>>

这是输出:

listA = list(listB)

我最近一直在学习C ++,所以我想寻找一个奇怪的参考或其他东西......

......但这是Python。

编辑:该死的! 是一个引用问题。

要复制列表,可以使用

listA = listB[:]

iSelect = $('#meal').val();
iLength = $('#meal option:selected').length;
for (i = 0; i < iLength; i++){
    $('#meal').val(iSelect[i])
    document.form.submit();
}

2 个答案:

答案 0 :(得分:2)

您的问题出在cycle()函数中。

def cycle( theList ):
    cycleList = []
    if len(theList) < 3:  # <<< PROBLEM IS HERE <<<<<
        return theList  # <<<<< PROBLEM IS HERE <<<<<
    for ii in range( len(theList) - 2 ):
        cycleList.append([ 
                theList[ii],
                theList[ii + 1],
                theList[ii + 2] ])
    return cycleList

在外fromListB = [fromListA[0]]循环中执行for时,fromListB的长度为1。然后当您执行listB.append( cycle(fromListB) )时,cycle(fromListB)最终会返回您传入的相同列表,因此listB[0]现在指向与fromListB相同的列表。

现在,当您在内部fromListB.append( fromListA.pop( len(fromListA) - 1 ))循环中执行for时,您正在修改listB[0]指向的相同列表。

顺便说一句,相关位是fromListB.append('ANYTHING'),而不是你从fromListA弹出的事实。

答案 1 :(得分:1)

问题在于 -

listB.append( cycle(fromListB) )

如果List的长度小于3,则循环函数直接返回'theList'。对于fromListB,情况就是这样,因此ListB的第一个元素是对fromListB的引用,当你花费到fromListB时,它也反映了在ListB的第一个元素。