Python函数语法似乎无效,但可以运行

Python函数语法似乎无效,但可以运行,python,syntax,memory-leaks,Python,Syntax,Memory Leaks,总之,我今天在python中遇到了一个奇怪的惊喜。下面的代码可以工作,但似乎违反了python的语法。我不知道为什么它在没有pass语句或一些代码的情况下可以工作,但它确实可以 def test(): '''Sample docstring.''' for i in range(10): test() print "testing", i 我想确定为什么会这样,以及它在运行时是否会在内存中留下任何讨厌的部分。这可能是我一直试图查找的内存问题的原因。一个块中必须至少有一

总之,我今天在python中遇到了一个奇怪的惊喜。下面的代码可以工作,但似乎违反了python的语法。我不知道为什么它在没有pass语句或一些代码的情况下可以工作,但它确实可以

def test():
    '''Sample docstring.'''

for i in range(10):
    test()
    print "testing", i

我想确定为什么会这样,以及它在运行时是否会在内存中留下任何讨厌的部分。这可能是我一直试图查找的内存问题的原因。

一个块中必须至少有一条语句。单个字符串文字被视为有效语句,即使它被用作docstring。但是它不应该导致任何内存泄漏,因为编译器在实际代码中省略了它。

docstring也是一条语句。(确切地说,这是一个表达式语句。)


编译器对它进行了特殊处理,但在语法上它是一个完全有效的语句。

Python的语法在语言参考中有解释。有关部分包括:

因此,函数的语法是冒号之前的所有内容,后面是
套件

因此,
套件
可以是
stmt\u列表
或包含至少一条
语句的缩进块
。。。一个
stmt\u列表
就是一行上用分号连接的一堆
simple\u stmt

最后:

这表明
simple_语句
可以是任何表达式,也可以是
assert
或列表中的任何其他语句

您可以单击这些页面上的链接进行进一步探索。一个
表达式\u stmt
就是任何一个自己计算的表达式,比如:

dir
2
"cat"
int()
这是一个非常有效的python程序,它将解析并运行,即使它什么都不做

函数的docstring也是一个表达式。它只是一个碰巧被系统特别处理的字符串

但是,特殊处理不是语法的一部分。它发生在另一个阶段,在解析器构建其抽象语法树之后很久


我会在别处寻找内存问题…:)

test()
的docstring下添加一个
pass
,看看内存泄漏是否消失,不是很简单吗?这是一个简化的示例。实际的代码只显示了“真实世界”中的漏洞,而当我通过它时,我正在排除可能的漏洞。你已经回答了我的问题,谢谢!不是docstring是一个语句,而是string literal是一个语句;通过分配给
。\uuuu doc\uuuuu
,可以在函数外部创建docstring,但如果其中没有语句,则无法编译。详细信息为+1,指向python参考的几个角落的链接为+1。
...
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
...
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
...
simple_stmt ::=  expression_stmt
             | assert_stmt
             ...
dir
2
"cat"
int()