Python:操作列表到位

时间:2014-10-05 20:50:37

标签: python

作为编程的初学者,我试图用Python做到这一点。我希望有一个简单的函数,它以列表作为参数,并返回另一个列表,它只是旋转一次的原始列表(因此rotate([1, 2, 3])将返回[2, 3, 1]),同时保持原始列表不变。

我知道这一个

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

会更改列表(并返回None)。

但是这个

def rotate_2(list):
    temp = list
    temp.append(temp[0])
    temp.remove(temp[0])
    return temp

也会更改原始列表(返回所需列表时)。

第三个

def rotate_3(list):
    temp = [x for x in list]
    temp.append(temp[0])
    temp.remove(temp[0])
    return temp

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

我无法理解rotate_2的行为。当函数在list上执行某些操作时,为什么会更改temp?它让我感觉好像listtemptemp = list“链接”了。另外为什么rotate_3好吗?对不起,如果我的英语很奇怪,那不是我的第一语言(与Python不同)。

1 个答案:

答案 0 :(得分:2)

rotate_2中,templist引用相同的列表,因此当您更改一个时,它们都会发生变化。

rotate_3中,您正在制作副本。制作副本的一种更为惯用的方式是:

temp = list[:]

我个人会写下这个函数如下:

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

这使用slicinglist concatenation

请注意,由于listbuilt-in name,我已将l重命名为list