由副作用操作

时间:2017-07-12 07:07:04

标签: python python-2.7

从Python的文档: Comment about the list.reverse() method

它表示该方法不会返回新列表以提醒您它是由副作用操作的。那么" 通过副作用来运作"意思?

3 个答案:

答案 0 :(得分:2)

方法的主要作用是返回受影响的值。某些方法到位,因为它们修改对象而不返回修改后的版本。

这有时称为“副作用”,因为该方法不会返回更新的对象。

.reverse()一样,.sort()是另一种可以就地运作的方法。

要记住的关键是这些函数不返回任何值 - 它们的隐式返回值是None并且避免分配返回值。

以下是不做的示例:

>>> i = [3, 4, 0]
>>> reversed_i = i.reverse()
>>> reversed_i # reversed_i is None, the only value not printed by the Python shell.
>>> i 
[0, 4, 3] # The original object is modified.

答案 1 :(得分:1)

“按副作用操作”这里表示该方法通过就地反转来修改传入的列表。这可能不是您期望的行为 - 您可能期望列表不会被修改,但该方法将返回反向副本(这是reverse(list)所做的)。另一个选择是列表反转到位,但该方法将返回列表,因此您可以链接list.reverse().sort()之类的操作。文档解释了为什么不会发生这种情况:它会返回None,这样如果您错误地认为此方法在不修改原始列表的情况下返回了副本,那么您很快就会被证明是错误的。

有点令人困惑的是,就地操作被称为“副作用”,在这种情况下它是方法的全部要点;但“副作用”是改变对象的操作的一般术语,而不是(或除此之外)产生新对象。

答案 2 :(得分:1)

术语"副作用"是来自函数式编程的行话,一种完全围绕函数的编程风格。 Python有函数,但是有其他语言比Python更能用它们做。

在函数式编程中,除了参数之外不使用外部任何信息的函数,也不会影响外部任何信息但只返回值的函数,被称为纯函数。 / em>纯函数的一个特性是,如果用相同的参数调用它,总会得到相同的结果。功能性窥视说使用纯函数可以更容易推理代码,因为你不必知道整个程序状态。

如果一个函数影响了它自身以外的东西,那就称为副作用。该函数接受参数并返回一个值,因为它是函数的作用,但它执行一项或多项其他操作。更改可变参数的内容是副作用。 (纯函数式语言 - 只允许纯函数的语言 - 不具有可变容器,这使得这是不可能的。相反,它们构造新对象并返回它们。就像Python有元组而没有列表一样。)

将某些内容打印到标准输出,或写入文件或任何其他形式的输出也是一种副作用。所以你可能想知道:如果不允许副作用,纯函数式语言如何输出?答案是,非常谨慎。

Python有许多函数式编程结构。如果他们引起了你的兴趣,请调查学习Scheme或Haskell或F#,或其他一些函数式语言。