Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:为什么内联赋值会返回一个;无”;元素?_Python_List - Fatal编程技术网

Python:为什么内联赋值会返回一个;无”;元素?

Python:为什么内联赋值会返回一个;无”;元素?,python,list,Python,List,我对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() 突然它停止工作了!它只反转内部列表

我对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”元素的列表。有人能解释一下为什么会出现这种行为,以及这两个代码之间的区别吗?

函数
reverse()
将一个列表反转,并返回
None
,这就解释了这种奇怪的行为。正确的实施方法是:

def deep_reverse(L):
  ans = [i[::-1] for i in L]
  ans.reverse()
  return ans

此外,将参数重新分配和/或变异为函数也是个坏主意,这可能会导致意外的结果。有时,标准库中的函数出于效率原因(例如,
sort()
reverse()
)这样做是可以的,但它可能会导致混乱,就像您刚刚经历的那样。除非严格必要,否则您的代码不必以这种方式编写。

您的第一个
deep\u reverse
函数重新分配了
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
列表将丢失,对它所做的修改也将丢失。

您误用了列表理解。赋值给
L
不会改变传递给函数的任何内容,
reverse()
不会返回任何内容。L:i.reverse()中的i应该是
,但代码确实有效。如果它起作用,我怎么会误用它?您忘记了在两个函数的末尾返回L“如果它起作用,我怎么会误用它?”
5*[print(“Hello,world”)]
打印“Hello world”。你会认为它是正确使用乘法,即使这是你打算打印?@斯卡尔佩兹我不想归还任何东西。它只是修改列表而不返回它。但假设我返回L,第二个代码仍然不起作用,它再次改变了它的行为,所以它只反转外部列表,而不反转内部列表。因此,现在我没有返回,内部列表被反转,但外部列表没有,返回后,情况正好相反!这有意义吗?或者
反向(i)
,这可能比切片方法更可读谢谢您的解释@斯卡尔洛佩斯:这很公平<代码>列表(反向(i))
在这种情况下就可以了,但它看起来不像切片那么可读……谢谢。但正如我所解释的,我希望代码同时反转外部列表和内部列表。您的代码仅反转内部元素。编辑:实际上,我的第一个deep_reverse()函数可以工作,第二个是我遇到问题的函数。谢谢!现在有道理了!有关更多详细信息,请检查此SO问题:
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]]