作为编程的初学者,我试图用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
?它让我感觉好像list
和temp
被temp = list
“链接”了。另外为什么rotate_3
好吗?对不起,如果我的英语很奇怪,那不是我的第一语言(与Python不同)。
答案 0 :(得分:2)
在rotate_2
中,temp
和list
引用相同的列表,因此当您更改一个时,它们都会发生变化。
在rotate_3
中,您正在制作副本。制作副本的一种更为惯用的方式是:
temp = list[:]
我个人会写下这个函数如下:
def rotate_4(l):
return l[1:] + [l[0]]
这使用slicing和list concatenation。
请注意,由于list
是built-in name,我已将l
重命名为list
。