起因是我有一个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 条评论