我遇到了我的程序问题,其中一个方法正在保存它对其中使用的参数变量所做的一切。
这是一个示例:通过给定空格将列表元素向左移动的方法。
def moveLeft (perm, pos, spaces):
permTemp = perm
for n in range(spaces):
charMoved = permTemp[pos-n]
permTemp [pos-n] = permTemp[pos-n-1]
permTemp[pos-n-1] = charMoved
return permTemp
permO = [0,1,2,3] #original perm
print moveLeft(permO, -1, 2)
print moveLeft(permO, -1, 2)
print permO
期望输出将是:前两个是相同的(因为它打印方法的相同返回值),最后一个输出是原始列表([0,1,2,3])。 相反,我得到:
>>>
[0, 3, 1, 2]
[0, 2, 3, 1]
[0, 2, 3, 1]
答案 0 :(得分:2)
使用
permTemp = perm[:]
实际复制列表,而不是仅仅为同一个对象分配新名称。
Python赋值不会创建新对象,只会命名现有对象。这就是你要修改原始列表的原因。
答案 1 :(得分:1)
使用Sven的列表副本,但请注意您不需要时间变量来交换值:
def moveLeft(perm, pos, spaces):
permTemp = perm[:]
for n in range(spaces):
permTemp[pos-n], permTemp[pos-n-1] = permTemp[pos-n-1], permTemp[pos-n]
return permTemp