【问题标题】:Reversing a list in Python在 Python 中反转列表
【发布时间】:2013-07-11 11:20:59
【问题描述】:
def manualReverse(list):
    return list[::-1]

    def reverse(list):
        return list(reversed(list))   

list = [2,3,5,7,9]

print manualReverse(list)
print reverse(list)

我刚开始学习Python。谁能帮我解决以下问题?

1.list[::-1]怎么会返回reversed列表?

2.为什么第二个函数会抛出我NameError: name 'reverse' is not defined

【问题讨论】:

  • 切片符号见The Python Slice Notation
  • 你把函数缩进得太远了;它没有在全局级别定义,所以reversemanualReverse 中的一个本地 名称。取消缩进。
  • The Python Slice Notation的可能重复
  • 删除你的def reverse,使其与def ManualReverse 对齐 - 否则,你将定义一个函数inside 一个函数......缩进在 Python 中很重要
  • 不要将变量命名为 list。这将覆盖内置名称list,一旦您修复缩进,确实会导致上面的代码出错。

标签: python list reverse


【解决方案1】:

[::-1] 等价于[::1],但不是从左到右,而是从右到左。负步长为 1,这只是以相反的顺序返回所有元素。整个语法称为Python Slice Notation

之所以'reverse' is not defined 是因为你没有全局定义它。它是manualReverse 函数中的本地名称。您可以取消缩进该函数,使其成为全局函数。

def manualReverse(list):
    return list[::-1]

def reverse(list):
    return list(reversed(list))   

顺便说一句,将列表命名为list 绝不是一个好主意。它将覆盖内置类型,包括您所依赖的函数(list(reversed(list))

【讨论】:

  • manualReverse 也将成功反转一个元组并返回一个元组,但 reverse 如图所示将反转元组作为列表返回。更好的reverse 代码将是(假设list arg 重命名为seq):return type(seq)(reversed(seq))
【解决方案2】:

list[::-1] 使用切片表示法并返回所有元素,但顺序相反。 Explain Python's slice notation 这是一个带有示例的详细解释 - 它将回答这个问题以及更多类似的问题。

def reverse(list) 的缩进使其仅在 manualReverse(list) 内部可见。 如果您取消缩进,它将在全局范围内可见。

【讨论】:

  • 问题是“为什么 list[::-1] 将反向列表返回给我”。你的回答基本上是用稍微不同的措辞重复的。
  • @interjay 我不确定“怎么来”的答案是什么。直接的答案是“因为它是这样定义的”
  • [::-1] 不是反转列表的神奇语法。它是切片符号的一个实例,它是一个更一般的概念,真正的答案将解释这一点和/或参考文档。
【解决方案3】:

只需使用反向的内置函数

>>> reversed(my_list)

http://docs.python.org/2/library/functions.html?highlight=reversed#reversed

【讨论】:

  • 我的意见是尽可能使用内置函数。它更优化、更干净、更易读。使用 [::-1] 语法不是反转列表的正确方法。题中,除了缩进错误,reverse函数没有正确使用
  • 您有权发表自己的意见。但是这篇文章根本没有回答这个问题。 reversed 函数在问题中使用正确,除了使用list 作为变量名和内置函数时出错。
  • @P.M.你是对的,但是这家伙显然是想在这里学习一些东西。
猜你喜欢
  • 2014-03-19
  • 2016-03-09
  • 2021-09-21
  • 1970-01-01
  • 2016-02-17
  • 2021-07-28
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多