Python:就地操作列表[重复]

Posted

技术标签:

【中文标题】Python:就地操作列表[重复]【英文标题】:Python: manipulating list in place [duplicate] 【发布时间】:2014-11-30 04:08:15 【问题描述】:

作为编程的初学者,我试图用 Python 做这个和那个。我想要一个简单的函数,它接受一个列表作为它的参数,并返回另一个列表,它只是原始列表旋转一次(所以 rotate([1, 2, 3]) 将返回 [2, 3, 1] ),同时保持原始列表不变。

我知道这个

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

将更改列表(并返回无)。

但是这个

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 的行为。当函数只是在 temp 上做某事时,为什么要更改 list ?它给我一种感觉,好像 listtemptemp = list “链接”了。还有为什么rotate_3 ok?对不起,如果我的英语很奇怪,那不是我的第一语言(不像 Python)。

【问题讨论】:

因为temp = list创建副本,不像rotate_3中的列表理解。 【参考方案1】:

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

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

temp = list[:]

我个人会这样写这个函数:

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

这使用slicing 和list concatenation。

请注意,我已将 list 重命名为 l,因为 list 是 built-in name。

【讨论】:

据我了解,l = [1, 2] 在某种 Python 的柏拉图式宇宙中创建了一个列表并命名为 l,而 temp = l 只是为 提供了另一个名称 i> 列出,而l[:] 复制l 并对其进行切片? @LChris314:没错。

以上是关于Python:就地操作列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在Python列表中进行就地修改

简单的 Python 问题:为啥我不能将变量分配给排序列表(就地)? [复制]

迭代列表时更改列表的最佳方法[重复]

如何在 Python 中就地对整数数组进行排序?

python中的布尔列表操作[重复]

删除列表列表中的第一项 - 制作副本而不是就地修改