我在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();
}
答案 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的第一个元素。