在python或coffeescript中,为什么list.append不返回列表本身?如果是这样,递归可以简单得多

hai*_*jin 3 python functional-programming coffeescript

如果insert()返回列表本身,请考虑以下代码.

def sieve(l):
  if not len(l):
    return []
  return sieve(filter(lambda x: x%l[0] != 0, l)).insert(0, l[0])
Run Code Online (Sandbox Code Playgroud)

现在,我们必须依靠辅助函数在插入后返回列表.

def cons(a, l):
  l.insert(0, a)
  return l

def sieve(l):
  if not len(l):
    return []
  return cons(l[0], sieve(filter(lambda x:x%l[0] != 0, l)))
Run Code Online (Sandbox Code Playgroud)

可变/不可变对象的要点是完全有效的.

但是,对于可变的列表,IMHO,append()API可能需要再多一步来返回列表本身,而不是返回任何内容.Java StringBuilder就是一个很好的例子.我可以递归地对stringbuilder对象进行链接附加....希望我们也可以在这里使用它.

Bra*_*des 14

在Python中,这是一个大问题让初学者学习哪些对象是"不可改变的",不能被改变的,哪些是"可变",并可以改变-在后一种情况下,每一个对象引用看到相同的变化.这似乎让新人感到困惑."我无辜地称这个函数是我写的,突然的列表副本也改变了!"

所以Python有一个约定:不可变对象,当你要求它们进行调整时,返回新创建的对象,这就是答案 - 所以:

a = 'my string'
b = a.replace('y', 'e')
Run Code Online (Sandbox Code Playgroud)

使得b获得一个全新的字符串,同时a保持其原始值.显然,这样的方法必须返回一个值,因为通过检查原始的不可变对象本身,你无法看到变化.

但是,当你问一个可变对象来改变自己,它并没有返回自身,因为它并不需要 -你可以通过在原来的对象再次看看到的变化!这是Python中的关键语义信号:如果一个方法喜欢append()不返回一个新的对象,那么你可以只是看着旧的对象看到的变化,所以每个人都可以用其他的老对象的引用.