文档指出:
Python 程序是由代码块构建的。块是作为一个单元执行的一段 Python 程序文本。以下是块:模块、函数体和类定义。
这似乎意味着,与我的想法相反,缩进的代码片段,例如 if 语句或 for 循环的主体不是block。
我读得正确吗?作为一个单元执行意味着什么(例如为什么 for 循环不符合这个定义)?如果不是块,您将缩进的代码段称为什么?
这似乎意味着,与我的想法相反,缩进的代码片段,例如 if 语句或 for 循环的主体不是block。
事实上,至少在Python语言参考的技术背景下,我们通常所说的“缩进块”并不是“块”。
在技术规范中,单词被赋予与其通常含义不同的特定上下文含义并不罕见,不幸的是,当通常含义也是技术含义时,有时会发生这种情况。
如果不是块,您将缩进的代码段称为什么?
Python 语言参考将其称为套件。但我认为大多数 Python 程序员宁愿将其称为块,除非他们建议对语言参考进行编辑。
作为一个单元执行意味着什么(例如为什么 for 循环不符合这个定义)?
这意味着“块”(在Python语言参考的严格技术意义上)对应于代码对象,在堆栈帧中执行,并具有自己的词法范围。
循环for不满足此定义,因为它没有自己的代码对象、堆栈帧或词法范围;它的字节码是包含块的代码对象的一部分,它在包含块的堆栈帧中执行,并且它具有包含块的词法范围。
实际上,这意味着for循环(或任何其他套件)内声明的变量在套件执行后仍然在范围内,直到“块”结束。
我真的不喜欢复合语句中的变量不是语句的本地变量...为什么 Python 不允许我有一个小的变量范围?
类 C 语言具有“块作用域”(这里的“块”一词表示由一对大括号分隔的语句序列),但它们也允许您声明变量而不对其进行赋值,因此您可以在正确的范围,即使分配发生在不同的范围中。例如,以下内容在 C、Java 或类似语言中是完全可以的:
int x;
if(condition) {
x = 5;
} else {
x = 7;
}
Run Code Online (Sandbox Code Playgroud)
但 Python 是一种动态语言,在分配变量之前不需要声明变量,因此等效的 Python 代码是:
if condition:
x = 5
else:
x = 7
Run Code Online (Sandbox Code Playgroud)
如果 Python 的“套件”有自己的词法范围,那么这种模式就行不通;对于和范围x来说是本地的,并且之后不会在范围内。为了获得与 C 代码相同的行为,您必须在语句之前编写一个虚拟赋值,以便在正确的范围内进行声明(并且也许,这样和套件中的赋值就不会声明新的局部变量在自己的范围内)。这很愚蠢,而且没有什么好处,所以 Python 不是这样设计的也是有道理的。ifelsex = Noneifxnonlocal xifelse
| 归档时间: |
|
| 查看次数: |
230 次 |
| 最近记录: |