【发布时间】:2015-02-05 15:45:16
【问题描述】:
我了解到对象的可变性是根据其状态而不是其身份来定义的。
下面的程序更改函数 hailstone() 内名称 count 引用的本地范围对象的状态。
def hailstone(n):
count = 1
"""Print the terms of the 'hailstone sequence' from n to 1."""
assert n > 0
print(n)
if n > 1:
if n % 2 == 0:
count += hailstone(n / 2)
else:
count += hailstone((n * 3) + 1)
return count
if (__name__ == '__main__'):
result = hailstone(10)
print(result)
在阅读了this article 的以下段落后,我发现上面的代码在更改名称count 所指的本地范围对象的状态方面看起来不错(即count += hailstone(n / 2)):
忽略这一切。函数式代码的特点是一件事:没有副作用。它不依赖于当前函数之外的数据,也不会改变存在于当前函数之外的数据。所有其他“功能性”事物都可以从这个属性派生出来。学习时将其用作导绳。
那么,我怎么理解this answer这句话的意思:
在函数式编程中,改变变量的值是不合适的。
函数式编程是否允许在我的上述程序中更改名称 count 引用的本地范围对象的状态?
【问题讨论】:
-
您的代码没有副作用。无法从函数外部判断是否使用
count实现;它是一个纯粹的局部变量。此外,Python 中的整数是不可变的。count引用的对象永远不会改变,扩充的赋值引用了一个同名的新对象。 -
@jonrsharpe 是的,每当您修改该对象的值 (
>>> a = 2 >>> a += 2) 时,python 都会创建新的inttype 对象。我将如何定义可变性?是对象的状态改变还是对象的身份改变? -
@overexchange 参见例如stackoverflow.com/q/8056130/3001761
-
@overexchange 这不是一个合适的讨论;我不会在 cmets 中向你解释 Python 的整个对象模型。做一些研究!
标签: python language-agnostic functional-programming