python 中的变量范围(对于来自 perl 的人)
Variable scoping in python (for someone coming from perl)
我是 python 的新手,我是出于需要才拿起它的 - 用于搅拌机 API。
作为一个来自 Perl 的人(和更少 Javascript)我认为我 运行 陷入了 WRT 变量作用域的陷阱。例如在 Perl 中:
use strict;
my @list = ('a'..'z');
for my $v (@list) { print $v; }
print $v;
生成错误,而在 Python
mylist=['a', 'b', 'c']
for v in mylist:
print(v)
print (v)
工作正常,最后一条语句打印 'c'.
在Javascript中:
var list = ['a', 'b', 'c']
for (let j=0; j < list.length; j++) { console.log(j, list[j]) }
console.log(j);
会抛出错误(“j 未定义”——除非我省略 let
,在这种情况下它的行为类似于 Python)
所以我知道 for v in mylist
i python 在外部范围内定义了一个变量——与 Perl 不同的行为(部分 javascript)。
虽然我发现大部分转换相对简单,但变量作用域(及其表亲,将内置函数重新定义为变量的能力)令人困惑且难以理解(没有 use strict
- 唉)。
因此出现了一个问题:Python 中变量作用域的主要区别是什么,在使用 Perl 时应该牢记在心?
我对范围界定特别感兴趣 - 一般的过渡问题得到了很好的回答 here and common pitfalls are nicely addressed here
在Python语言参考中有提到,具体for循环是Compound statements / The for statement。您将看到语句:
Names in the target list are not deleted when the loop is finished, but if the sequence is empty, they will not have been assigned to at all by the loop.
另请查看名称绑定的执行模型。
perl
中看到的错误原因:
您使用了 my
关键字,并且根据文档:my
中的关键字 Perl
声明列出的变量是定义它的封闭块的局部变量。我的目的是定义静态范围。
所以在下面的代码中:
use strict;
my @list = ('a'..'z');
for my $v (@list) {
print $v;
}
print $v;
变量$v
的范围在for
循环内,因此在循环外访问时会抛出错误。
Javascript
.
中的 let
关键字也是如此
要了解 python
中的变量作用域,请参阅 this,其中有非常好的解释。
我是 python 的新手,我是出于需要才拿起它的 - 用于搅拌机 API。
作为一个来自 Perl 的人(和更少 Javascript)我认为我 运行 陷入了 WRT 变量作用域的陷阱。例如在 Perl 中:
use strict;
my @list = ('a'..'z');
for my $v (@list) { print $v; }
print $v;
生成错误,而在 Python
mylist=['a', 'b', 'c']
for v in mylist:
print(v)
print (v)
工作正常,最后一条语句打印 'c'.
在Javascript中:
var list = ['a', 'b', 'c']
for (let j=0; j < list.length; j++) { console.log(j, list[j]) }
console.log(j);
会抛出错误(“j 未定义”——除非我省略 let
,在这种情况下它的行为类似于 Python)
所以我知道 for v in mylist
i python 在外部范围内定义了一个变量——与 Perl 不同的行为(部分 javascript)。
虽然我发现大部分转换相对简单,但变量作用域(及其表亲,将内置函数重新定义为变量的能力)令人困惑且难以理解(没有 use strict
- 唉)。
因此出现了一个问题:Python 中变量作用域的主要区别是什么,在使用 Perl 时应该牢记在心?
我对范围界定特别感兴趣 - 一般的过渡问题得到了很好的回答 here and common pitfalls are nicely addressed here
在Python语言参考中有提到,具体for循环是Compound statements / The for statement。您将看到语句:
Names in the target list are not deleted when the loop is finished, but if the sequence is empty, they will not have been assigned to at all by the loop.
另请查看名称绑定的执行模型。
perl
中看到的错误原因:
您使用了 my
关键字,并且根据文档:my
中的关键字 Perl
声明列出的变量是定义它的封闭块的局部变量。我的目的是定义静态范围。
所以在下面的代码中:
use strict;
my @list = ('a'..'z');
for my $v (@list) {
print $v;
}
print $v;
变量$v
的范围在for
循环内,因此在循环外访问时会抛出错误。
Javascript
.
中的 let
关键字也是如此
要了解 python
中的变量作用域,请参阅 this,其中有非常好的解释。