Python中变量twice为何可加括号作为函数调用?
变量
twice可以被当作函数调用的核心原因 首先记住Python最基础的一条规则:在Python里函数和你平时用的数字、字符串、列表没什么本质区别,都是可以被赋值给变量、当成参数传递、作为返回值传出的普通对象,不存在「函数是特殊语法不能被变量存」的说法。
我们逐行拆你的代码逻辑就完全清楚了:
- 你定义的外层函数
echo(n),内部做了两件事:- 定义了内部函数
inner_echo(word1),这个函数的功能是把传入的字符串重复n次返回 - 最后返回
inner_echo——注意这里你写的是return(inner_echo),没有在inner_echo后面加调用括号,意思是返回的是inner_echo这个函数本身,不是调用inner_echo得到的执行结果
打个通俗的比方:不加括号返回函数,相当于你把一台「可以重复字符串的机器」直接递出去;如果加了括号
return inner_echo(),相当于你当场按开关跑了一次机器,把机器吐出来的成品(字符串)递出去,机器本身你没给。 - 定义了内部函数
- 接下来你写的
twice = echo(2),本质是调用了echo函数、传入参数n=2,echo执行完把它内部造好的那台inner_echo机器返回给你,你把这台机器存到了变量twice里。
这时候twice里存的根本不是数字、字符串,就是个实打实的函数对象,当然可以加括号传参调用。 - 你可能还会疑惑:echo函数执行完不就销毁了吗?它里面的参数n=2为什么后面调用twice的时候还能用?
这是Python的闭包特性:内部函数被返回的时候,会自动把自己运行需要用到的、定义时外层环境里的变量(这里就是n=2)一起打包绑定在自己身上,相当于这台机器出厂的时候就把「重复次数=2」这个配置焊死在硬件里了,不管你把它传到哪、存到哪个变量里,它都带着这个配置。所以你调用twice('hello')的时候,它就会自动用绑定好的n=2,返回hellohello。
你可以自己做个验证:再写一句thrice = echo(3),这时候调用thrice('hello')就会返回hellohellohello,本质就是echo(3)返回了另一台焊死n=3配置的inner_echo机器,存到了thrice变量里,和twice那台互不干扰。
内容的提问来源于stack exchange,提问作者julian lagier
相关产品推荐
相关产品推荐

