追加会删除 Python 中的最后一个索引



我的问题是我试图创建一个函数来返回列表的所有旋转的列表。当我在函数中编写"print"时,它似乎按预期工作,但是当我附加它时,最后一个索引丢失了。这是我的代码

def rotation(list):
l =[]
for i in range(len(list)):
m = list.pop()
list = [m]+list
print(list)
l.append(list)
return l
print(rotation(["a","b","c","d"]))

输出为

['d', 'a', 'b', 'c']
['c', 'd', 'a', 'b']
['b', 'c', 'd', 'a']
['a', 'b', 'c', 'd']
[['d', 'a', 'b'], ['c', 'd', 'a'], ['b', 'c', 'd'], ['a', 'b', 'c', 'd']]

为什么"print"中的值没有直接进入附加列表,除了最后一个(['a','b','c','d'](工作正常?任何帮助将不胜感激,谢谢

在python中,所有可变对象都是通过引用传递的,这意味着当你做l.append时,你实际上是在附加一个对list的引用

然后当你从list再次pop时,l中的相同引用被弹出,我将尝试在每行执行后用实际值进行解释:

l =[]
for i in range(len(list)):

在这一点上,l[]list['a', 'b', 'c', 'd']

m = list.pop()

list['a', 'b', 'c'],m 现在是'd'

list = [m]+list
print(list)
l.append(list)

list现在['d', 'a', 'b', 'c'],我们打印值并将其附加到现在[['d', 'a', 'b', 'c']]l

然后我们开始第二次迭代:

m = list.pop()

这里发生了两件事,list现在['d', 'a', 'b'],所以包含对list的引用的l变得[['d', 'a', 'b']]

list = [m]+list

list现在变成了一个结合了[m]list的新列表,引用将丢失,现在您正在对新列表进行操作,从而使列表处于lpop

使用 pop 时,该值将从该列表中消失。

如果要获取列表的最后一个值而不完全删除,请使用订阅 [-1]。

def rotation(lst):
l =[]
for i in range(len(lst)):
l.append(lst)
m = lst[-1]
lst = [m]+lst[:-1]
return l
print(rotation(["a","b","c","d"]))

输出:

[['a', 'b', 'c', 'd'], ['d', 'a', 'b', 'c'], ['c', 'd', 'a', 'b'], ['b', 'c', 'd', 'a']]

m = list.pop(( -> 这部分显示最后一个元素并删除它。 如果我是你,我会尝试使用这样的东西:

m = list[-1]

[-1] 返回最后一个元素

然后,如果您需要使用没有最后一个元素的列表,请使用以下命令:

new_list = list[0:-1]

new_list 等于"列表"在 0 到最后一个元素(不包括它(的范围内

这是一个网站,列出了你可以在 Python 中对列表对象执行的所有操作。 https://www.w3schools.com/python/python_lists.asp

如前所述,l.append(list)向列表添加一个链接,而不是值,当您更改它(列表(时,所有链接都指向更改的列表。在迭代结束时,您添加了包含 4 个元素的列表,在下一个元素开始时,您删除了最后一个元素,即 3-3-3-4。使用list.copy(),它是为这些事情准备的。

def rotation(list):
l = []
for i in range(len(list)):
m = list.pop()
list = [m]+list  
# Little tricks in single line: list[:0] = list.pop()
l.append(list.copy())
return l
print(rotation(["a","b","c","d"]))

最新更新