为何这段包含大括号的Python代码能够正常运行?
Python里的“大括号”小意外
玩Python的人都知道,不用大括号定义代码块,全靠缩进是这门语言的标志性特性——这事儿甚至被CPython做成了个损人的小彩蛋:
>>> from __future__ import braces SyntaxError: not a chance
本来我一直觉得Python和大括号在代码块这事上是彻底划清界限的,直到在某个已删除的论坛上刷到这段代码,当时我直接黑人问号:这玩意儿能跑?结果亲手试了下,还真输出了Hello!
>>> def hi(): { print('Hello') } >>> hi() Hello
那这到底是啥情况?其实这里的大括号根本不是用来定义代码块的!Python里的大括号要么是用来创建字典,要么是作为表达式分组的符号。在这个例子里,{ print('Hello') }就是个表达式语句——把print的调用包在了大括号里而已,而Python允许单行函数体直接跟在冒号后面,不用换行缩进。所以这代码其实和下面这段完全等价:
>>> def hi(): print('Hello') >>> hi() Hello
说白了,这里的大括号就是个多余的“摆设”,Python根本没把它当代码块界定符,只是当成表达式的分组标记处理了。是不是挺有意思的冷知识?
内容的提问来源于stack exchange,提问作者Mark Ransom




