- 论坛徽章:
- 0
|
原帖由 cobrawgl 于 2007-9-20 15:30 发表
use strict;
use warnings;
{
my $x = 'A';
sub f { sub { $x++ } }
sub g { sub { $x++ } if $x }
}
my $F=f();
my $G=g();
print $F->(),$G->(),"," f ...
楼主提了一个好问题,最近学了一点PYTHON,碰到的问题与楼主类似,大家讨论下:
1、第一个版本,在closure中绑定global变量
- outter = 1
- def make_function():
- def inner():
- global outter # 见注1
- outter = outter + 1
- return outter
- return inner
- f = make_function()
- print(f())
- print(f())
- print(f())
- 输出结果:
- 2
- 3
- 4
复制代码
注1:在Python语言中,变量的可视性缺省为局部,如果要引用全局变量的话,需要使用global申明。
2、第二个版本,在closure中绑定local变量
- def make_function():
- outter = 1
- def inner():
- outter = outter + 1
- return outter
- return inner
- f = make_function()
- print(f())
- print(f())
- print(f())
复制代码
结果编译出错!
- UnboundLocalError: local variable 'outter' referenced before assignment
复制代码
3、第三个版本,使用royalzhang网友的“提及变量”的方法
发现这个方法在Python中不管用,编译会报错。
4、有人认为这也算python的一个bug,据说在py3000中,内部函数可以绑定外部函数的局部变量,但是我对那个东东就没有研究了。
PS:小弟我感觉perl对于我来说过于复杂了,已经追随limdou走的道路转投python阵营了,作为Python初学者,在资深perler们面前献一回丑,呵呵!
[ 本帖最后由 DennisRitchie 于 2007-9-21 16:48 编辑 ] |
|