免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: cobrawgl
打印 上一主题 下一主题

大家对这个程序怎么看?谁能帮忙用 ruby、python 实现一下,看看结果? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-09-21 14:39 |只看该作者

回复 #10 royalzhang 的帖子

饿。。。只能说大致理解了意思
内部传递时,中间“空”传递了一次
竟然就没被识别为'A',成为未初始化的。。默认成为0
而且编译也就顺利通过了,真诡异,实际上说来,f的调用并没有对外层的$x产生影响,也就失去了闭包的价值?
虽然说,外层有$x的申明,内层才能使用$x,但是。。。却能自己记录自己的1,2,3
那是不是说f->()里面的$x被识别为f{}里面的$x了,所以g不可见,所以,f和g分别有自己的$x
感觉还是不太懂啊

论坛徽章:
0
12 [报告]
发表于 2007-09-21 15:01 |只看该作者
原帖由 perljoker 于 2007-9-21 14:39 发表
却能自己记录自己的1,2,3 ...

关键在于初始化。closure在第一次调用以后,就会保留上下文的一个复制,所以纪录自己的1,2,3是正常的。

论坛徽章:
0
13 [报告]
发表于 2007-09-21 15:34 |只看该作者
刚找到perlbug上类似的讨论:
http://rt.perl.org/rt3/Public/Bug/Display.html?id=7519

论坛徽章:
0
14 [报告]
发表于 2007-09-21 16:06 |只看该作者
This bug has been fixed in the latest development version
of Perl (which will eventually be released as 5.10.0).

----------------------------------------

谁有 5.10.0?

论坛徽章:
0
15 [报告]
发表于 2007-09-21 16:46 |只看该作者
原帖由 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变量

  1. outter = 1
  2. def make_function():
  3.         def inner():
  4.                 global outter # 见注1
  5.                 outter = outter + 1
  6.                 return outter
  7.         return inner

  8. f = make_function()
  9. print(f())
  10. print(f())
  11. print(f())

  12. 输出结果:
  13. 2
  14. 3
  15. 4
复制代码

注1:在Python语言中,变量的可视性缺省为局部,如果要引用全局变量的话,需要使用global申明。

2、第二个版本,在closure中绑定local变量

  1. def make_function():
  2.         outter = 1
  3.         def inner():
  4.                 outter = outter + 1
  5.                 return outter
  6.         return inner

  7. f = make_function()
  8. print(f())
  9. print(f())
  10. print(f())
复制代码

结果编译出错!
  1. 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 编辑 ]

论坛徽章:
0
16 [报告]
发表于 2007-09-21 17:41 |只看该作者
原帖由 DennisRitchie 于 2007-9-21 16:46 发表

小弟我感觉perl对于我来说过于复杂了,已经追随limdou走的道路转投python阵营了,作为Python初学者,在资深perler们面前献一回丑,呵呵!


不好意思,看不出你这贴有什么意义

论坛徽章:
0
17 [报告]
发表于 2007-09-21 18:46 |只看该作者
原帖由 cobrawgl 于 2007-9-21 17:41 发表


不好意思,看不出你这贴有什么意义

15楼的帖子讨论了python语言中closure的变量绑定问题,你不是想“知道类似的程序在 ruby和 python 里是什么输出”?

PS:你何必这么小气了?不就是说了你们几句吗?哎。。。你看看flw的最新的签名档吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP