起因是我有一个Python的问题:

请用python帮我实现一个这样的功能:@rpm(6),这代表每分钟只能运行6次,限制使用了这个修饰符的函数的速率能够和修饰符规定的一致

下面是GPT-4o的回答:

我注意到它保存上次调用时间的变量,用的是一个list,所以我就进一步询问4o为什么这么做:

大概就是Python的闭包中,不可以随意修改外部变量,如果使用一个list那么就可以绕过Python的限制了。
我又将这个问题给Yi-large来解答,得到了相同的方法:

此时我认为Python如果在闭包中如果不使用这种trick的方式,就没法修改外部变量了,于是我又去询问了Opus和Gemini,我发现它们没有使用这种trick:

当时我还以为这两个大模型写错了,喷了一顿,但是我后面继续深追为什么大模型不使用数组trick来实现闭包内部修改,我发现如果使用了nonlocal就可以达到相同的效果,并且这样似乎是Python的官方用法?

这样对比下来,似乎4o的方法并不一定是最好的,如果Python官方修复了这种所谓的trick,让代码能够按照正常方式运作了(这是有先例的,比如最近修复的for),那这段代码就会失效了。这么看来,Gemini不管是从语言的用法,还是从代码的工整、健壮性,都要强一些。我宣布这轮Gemini获胜!
Python的闭包不允许修改外部变量这个知识点我还真没了解过,nonlocal就是为了解决这个问题而设计的关键字,所以当然用nonlocal是最合理的。


0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注