for循环,lst [i] = lst [i-1]-Python

时间:2019-10-13 15:26:01

标签: python

为什么不起作用?

def func(lst):
    for i in range(len(lst)):
        lst[i] = lst[i - 1]
    return lst


print(func([1, 2, 3, 4]))

预期输出:[4, 1, 2, 3]
实际输出:[4, 4, 4, 4]

为什么python在应为lst [1] = lst [0]时分配lst [1] = lst [-1]

7 个答案:

答案 0 :(得分:1)

以下作品。 lst [i]已在for循环中重置。


def func(lst):
    output = []
    for i in range(len(lst)):
        output.append(lst[i - 1])
    return output


print(func([1, 2, 3, 4]))

答案 1 :(得分:0)

您在这里遇到逻辑错误,在第一次迭代时,您会像lst [0] = lst [-1]一样执行smth,然后将此值拉至所有剩余的indees。如果要向左移动数组,请尝试以下操作:

def shifter(lst):
    return lst[-1:] + lst[:-1]

答案 2 :(得分:0)

列表是可变对象,您正在单个列表上进行迭代。在每次迭代中,变量lst指向列表的当前状态,并且在循环内您正在修改该当前状态。

您期望的答案将要求Python在循环开始时复制并记住列表的初始状态,而Python不会这样做。

def func(lst):
    initial = lst[:]  # copy lst
    for i in range(len(lst)):
        lst[i] = initial[i - 1]
    return lst


print(func([1, 2, 3, 4]))

答案 3 :(得分:0)

def func(lst):
for i in range(len(lst)):
    print(i, lst[i-1])
    lst[i] = lst[i - 1]
return lst

如果您查看代码的执行方式,则第一次迭代i将为0,而lst [i-1]将为lst [-1],它指向数组(4)中的最后一个元素。因此,在第一次迭代之后,您的数组如下所示: [4,2,3,4] 在第二个中,i = 1,而lst [i-1]将是lst [0],其值现在为4!因此,现在lst [1]将为4: [4,4,3,4] 等等.... 希望有帮助。

答案 4 :(得分:0)

您可以在第一个索引处插入最后一个项目,之后再删除最后一个项目:

def func(lst):
    lst[:0] = lst[-1:]
    del lst[-1:]
    return lst

使func([1, 2, 3, 4])返回:[4, 1, 2, 3]

答案 5 :(得分:0)

单步执行代码,一次:

最初,lst[1, 2, 3, 4],所以len(lst)4range(n)0n - 1返回值,因此循环将使用值012和{{1 }}。

第一次循环迭代:

  • 3i
  • 0 => lst[i] = lst[i - 1] => lst[0] = lst[0 - 1]
  • lst[0] = lst[-1]现在为lst

第二循环迭代:

  • [4, 2, 3, 4]i
  • 1 => lst[i] = lst[i - 1] => lst[1] = lst[1 - 1]
  • lst[1] = lst[0]现在为lst

第三循环迭代:

  • [4, 4, 3, 4]i
  • 2 => lst[i] = lst[i - 1] => lst[2] = lst[2 - 1]
  • lst[2] = lst[1]现在为lst

第四循环迭代:

  • [4, 4, 4, 4]i
  • 3 => lst[i] = lst[i - 1] => lst[3] = lst[3 - 1]
  • lst[3] = lst[2]现在为lst

答案 6 :(得分:0)

已建议交换。不要那样做:

def func(l):
    for i in range(len(l) // 2):
        l[i], l[-i - 1] = l[-i - 1], l[i]

    return l

# func([1, 2, 3, 4]) -> [4, 3, 2, 1]

要把给定列表/数组的最后一个元素移动到第一个位置(如您所描述的那样,将其作为所需的输出),如果输入是链接列表,请使用blhsing's implementation。 Python列表是链接列表,因此blhsing的实现对此非常有效。如果您输入的是连续数组(例如Numpy数组),请使用以下命令:

def func(l):

    l_last = l[len(l) - 1]

    for i in range(len(l) - 1, 0, -1):
        l[i] = l[i - 1]

    l[0] = l_last

    return l

我们的两个实现都对输入列表/数组进行了变异。

为什么函数输出[4, 4, 4, 4]
i_max = len(<list>) - 1
<list>[-i] = <list>[len(<list>) - i]
{for i in range(len(<list>))i_n01}中的... => i_max
i_n = 0 => <list>[0] = <list>[i_max - 1]
如果为<list> = [1, 2, 3, 4],则为[1, 2, 3, 4][0] = [1, 2, 3, 4][3] = [4, 2, 3, 4]
在接下来的迭代中,将第i个元素替换为第i-1个元素,从而得到:
[4, 2, 3, 4] => [4, 4, 3, 4] => [4, 4, 4, 4] => [4, 4, 4, 4]