gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:15:31 25 4
gpt4 key购买 nike

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

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

目前,我们必须依靠辅助函数在插入后返回列表。

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)))

可变/不可变对象(immutable对象)的观点是完全正确的。

但是,对于可变列表,恕我直言,append() API 可以采取更多步骤来返回列表本身,而不是不返回任何内容。 Java StringBuilder 就是一个很好的例子。我可以递归地对 stringbuilder 对象进行链式追加....只是希望我们也能在这里拥有它。

最佳答案

在 Python 中,让初学者了解哪些对象是“不可变的”且不能更改的,哪些对象是“可变的”且可以更改的是一件很重要的事情——在后一种情况下,每个 对对象的引用看到相同的变化。这似乎确实使新手感到困惑。 “我天真地调用了我编写的这个函数,突然我的列表副本也发生了变化!”

因此 Python 有一个约定:不可变对象(immutable对象),当您要求它们进行调整时,返回作为答案的新创建的对象 — 所以:

a = 'my string'
b = a.replace('y', 'e')

使 b 获得一个全新的字符串,而 a 保持其原始值。显然,此类方法必须返回一个值,因为您永远无法通过检查原始的、不可变的对象本身来查看更改。

但是当你要求一个可变对象改变自己时,它不会返回自己,因为它不需要——你可以通过查看又是原来的对象!这是 Python 中的一个关键语义信号:如果像 append() 这样的方法没有返回一个新对象,那么你可以通过查看旧对象来看到变化,也可以引用旧对象的其他人。

关于python - 在 python 或 coffeescript 中,为什么 list.append 不返回列表本身?如果是这样,递归可以简单得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7410850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com