答案 0 :(得分:9)
第二个Perl示例中的行$x = shift
只是覆盖了一个全局的,词法范围的变量,就像将global x
添加到Python代码一样。
这与动态范围无关,还有许多其他语言与Perl具有相同的行为 - 我认为Python是一个奇怪的人,因为要求显式导入在词法范围内可见的变量名。
Perl代码的真正问题不是词法作用域,而是缺少声明的参数。使用声明的参数,就不可能忘记my
,问题就会消失。
我发现Python的范围界定方法(从Python 2开始)更有问题:它是不一致的(全局变量的显式导入以获得读写绑定,而嵌套函数中的词法自动绑定,但是只读)并使关闭secon级公民。