首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:为什么内联赋值列表值会返回一个"None“元素的列表?

问Python:为什么内联赋值列表值会返回一个"None“元素的列表?
EN

Stack Overflow用户
提问于 2017-07-14 08:04:02
回答 2查看 201关注 0票数 2

我仍然是Python的新手,并且我一直在编写一个小函数来反转列表,包括原始列表和其中的列表。这是我的代码:

代码语言:javascript
复制
def deep_reverse(L):
    L.reverse()
    L = [i.reverse() for i in L]

现在这段代码运行得很好,但如果我做了一点小改动,并像这样重新排列行:

代码语言:javascript
复制
def deep_reverse(L):
    L = [i.reverse() for i in L]
    L.reverse()

突然它停止工作了!它只反转内部列表,而不是原始列表。将一些调试print()语句放入其中,我可以看到第一个代码在第一行之后颠倒了原始列表并打印了它,但第二个代码实际上在颠倒列表之后打印了一个包含'None‘元素的列表。谁能解释一下为什么会出现这种行为,两种代码之间的区别是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-14 08:15:45

reverse()函数就地反转列表并返回None,这解释了这种奇怪的行为。正确的实现应该是:

代码语言:javascript
复制
def deep_reverse(L):
  ans = [i[::-1] for i in L]
  ans.reverse()
  return ans

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

票数 1
EN

Stack Overflow用户

发布于 2017-07-14 08:23:21

您的第一个deep_reverse函数重新分配了L,但它不是全局参数,因此不会在函数中返回。因此,这个变量会丢失。但是,您在适当的地方改变了列表,因此修改仍然存在,这就是它仍然有效的原因!您的原始函数等同于以下内容(请注意,没有最终赋值):

代码语言:javascript
复制
def deep_reverse(L):
    L.reverse()
    [i.reverse() for i in L]

这可能应该使用for循环来编写:

代码语言:javascript
复制
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列表就会丢失,对它所做的修改也会丢失。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45092656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档