python:就地操作列表

Python: manipulating list in place

本问题已经有最佳答案,请猛点这里访问。

作为编程的初学者,我尝试着用Python来实现这一点。我想要有一个简单的函数,它以一个列表为参数,返回另一个列表,该列表只是原始列表旋转一次(所以rotate([1, 2, 3])将返回[2, 3, 1],同时保持原始列表不变。

我知道这个

1
2
3
def rotate(list):
    list.append(list[0])
    list.remove(list[0])

将在适当的位置更改列表(并且不返回任何列表)。

但是这一个

1
2
3
4
5
def rotate_2(list):
    temp = list
    temp.append(temp[0])
    temp.remove(temp[0])
    return temp

还可以在适当的位置更改原始列表(同时返回所需的列表)。

第三个呢

1
2
3
4
5
def rotate_3(list):
    temp = [x for x in list]
    temp.append(temp[0])
    temp.remove(temp[0])
    return temp

给出所需的结果,即返回一个新列表,同时保持原始列表不变。

我不明白rotate_2的行为。当函数只是在temp上执行某些操作时,为什么要更改list?它给我一种感觉,好像listtemptemp = list连接在一起。为什么rotate_3还可以?对不起,如果我的英语很奇怪,那不是我的第一语言(不像Python)。


rotate_2中,templist指的是同一个列表,所以当你改变一个列表时,它们都会改变。

rotate_3中,您正在复制。一种更惯用的复制方法是:

1
temp = list[:]

我个人将写下以下函数:

1
2
def rotate_4(l):
    return l[1:] + [l[0]]

这将使用切片和列表连接。

注意,我已经将list重命名为l,因为list是内置名称。