【问题标题】:Behaviour of .reverse() function in pythonpython中.reverse()函数的行为
【发布时间】:2023-03-10 16:00:01
【问题描述】:

我来自 R 背景,对以下内容感到困惑:

假设我在变量 txt 中保存了列表格式的“hello”。因此

 txt=  ['h','e','l','l','o']

经过一些测试,以下工作:

txt.reverse()
"."join(txt)

并按预期产生olleh

但是,以下操作不起作用

"".join(txt.reverse())

它给出了一个错误。我很好奇为什么会这样,因为我认为我可以在函数调用中“嵌套”函数调用?

感谢您的帮助!

【问题讨论】:

  • 您可以改用reversed"".join(reversed(txt))
  • @roippi reversed 就地。在解释器上尝试reversed([1,2,3]),它会返回一个listreverseiterator 对象,这意味着没有复制。不同之处在于.reverse() 修改了原始列表,而reversed() 对其进行了迭代。
  • @Bakuriu 是的。今天没喝咖啡。 “就地”(或相反)对于任何类型的迭代器都是一个糟糕的描述。
  • @Bakuriu 这只是意味着reversed 返回一个迭代器,它将以相反的顺序返回项目。它不会修改 reverse 方法所做的原始参数。

标签: python


【解决方案1】:

问题在于reverse() 函数确实没有返回一个有用的值(它返回None),因为它在原地反转列表,作为一种避免需要创建一个新的输出列表。所以这个:

"".join(txt.reverse())

...将尝试加入None,显然会失败。

【讨论】:

    【解决方案2】:

    作为就地函数,列表的reverse 方法总是返回None

    >>> a = [1, 2]
    >>> print a.reverse()
    None
    >>> a
    [2, 1]
    >>>
    

    您可以使用内置的reversed 获得您想要的行为:

    >>> a = ['a', 'b']
    >>> "".join(reversed(a))
    'ba'
    >>> a
    ['a', 'b']
    >>>
    

    【讨论】:

    • 可能还显示reversed 示例中a 的未修改值,就像您在reverse 中所做的a 修改值一样?
    • 太棒了,这正是让我感到困惑的地方。在 R 中,它几乎总是一个返回的对象,所以我不必担心它。完全有道理。再次感谢您。
    • @user1357015 在具有副作用的 python 操作中,通常not返回一个值(即它们返回None)。相反,返回值的函数通常有副作用。这是一个经常使用的约定。顺便说一句:您总是可以使用一些ors:"".join(txt.reverse() or txt) 获得 R 行为。 txt.reverse() 返回 None,这被认为是错误的,因此 python 将评估 txt 并返回它(orand 的返回值需要 not 是布尔值)。但是,这似乎很脏。
    【解决方案3】:

    你的问题是txt.reverse() 不返回反向列表,它返回None

    即,txt.reverse() 将您的列表反转

    【讨论】:

      【解决方案4】:

      您可以改用reversed

      ".".join(reversed(txt))
      

      【讨论】:

        【解决方案5】:

        如前所述,list.reverse() 就地替换列表,从而返回None

        如果你想要一个可嵌套的版本,你可以使用reversed 函数

        In [7]: "".join(reversed(txt))
        Out[7]: 'olleh'
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-05
          • 1970-01-01
          • 1970-01-01
          • 2013-03-21
          • 2020-05-22
          • 2020-10-06
          相关资源
          最近更新 更多