我仍然是Python的新手,并且我一直在编写一个小函数来反转列表,包括原始列表和其中的列表。这是我的代码:
def deep_reverse(L):
L.reverse()
L = [i.reverse() for i in L]现在这段代码运行得很好,但如果我做了一点小改动,并像这样重新排列行:
def deep_reverse(L):
L = [i.reverse() for i in L]
L.reverse()突然它停止工作了!它只反转内部列表,而不是原始列表。将一些调试print()语句放入其中,我可以看到第一个代码在第一行之后颠倒了原始列表并打印了它,但第二个代码实际上在颠倒列表之后打印了一个包含'None‘元素的列表。谁能解释一下为什么会出现这种行为,两种代码之间的区别是什么?
发布于 2017-07-14 08:15:45
reverse()函数就地反转列表并返回None,这解释了这种奇怪的行为。正确的实现应该是:
def deep_reverse(L):
ans = [i[::-1] for i in L]
ans.reverse()
return ans此外,给函数重新分配和/或改变参数也不是一个好主意,这可能会导致意想不到的结果。有时标准库中的函数出于效率原因(例如,sort()和reverse())这样做,这是可以的-但它可能会导致混淆,就像您刚刚经历的那样。除非绝对必要,否则您的代码不必以这种方式编写。
发布于 2017-07-14 08:23:21
您的第一个deep_reverse函数重新分配了L,但它不是全局参数,因此不会在函数中返回。因此,这个变量会丢失。但是,您在适当的地方改变了列表,因此修改仍然存在,这就是它仍然有效的原因!您的原始函数等同于以下内容(请注意,没有最终赋值):
def deep_reverse(L):
L.reverse()
[i.reverse() for i in L]这可能应该使用for循环来编写:
def deep_reverse_2(L):
L.reverse()
for i in L:
i.reverse()
L = [[1, 2, 3], [2, 3, 4]]
deep_reverse_2(L)
>>> L
[[4, 3, 2], [3, 2, 1]]第二个函数不起作用,因为您在函数内部重新分配了L (它现在是函数的本地变量,而不是您传递给函数的同一个L变量)。如果您使用id进行检查,它们将具有不同的内存位置。如果没有返回任何内容,这个新的L列表就会丢失,对它所做的修改也会丢失。
https://stackoverflow.com/questions/45092656
复制相似问题