- 论坛徽章:
- 1
|
原帖由 ttvast 于 2007-1-25 10:50 发表
你们不能站在你们精通perl的角度看perl,而是应该站在一个不熟悉人的角度去看
你这个想法非常好。
事实上,我正是这么要求自己的(从一些言语之间,也能看出 Larry Wall 也是这么要求自己的,因为他写的《Programming Perl》第一章最后一节的标题就是 "What You Don't Know Won't Hurt You (Much)" 也就是说,即使是站在一个 Perl 新手的角度,Perl 也能够尽可能地为他所用)
BTW:顺便要求一下,希望您也能够站在一个不熟悉 Python 的人的角度去看。
当然了,你跟我讲的时候可以稍微深奥一些,我乐于和你交流 Python。
原帖由 ttvast 于 2007-1-25 10:50 发表
第一个问题就是=号具有传递性,任何人看了这个都会认为$a == $b
第二个问题就是,为何同样一个逻辑或有两种表达方式。
很好,恕我冒昧说一句,你比 shhgs 有资格接受这个问题的答案,我现在就和你探讨一下,希望你能跟踪到底。
1,不错,等号是具有传递性,数学中便是如此,然而,第一个例子中的 = 号不是等号,而是赋值号——这个我想接触过编程语言的人都明白。
赋值号不是等号,因为是一种动作,因此针对不同的数据类型做赋值这个动作,按照 Python 的“一切皆对象理论”,实际上是调用了不同对象的赋值方法(C++ 中叫“拷贝构造函数”),因此它没有传递性。举个 C 的例子:
unsigned char a;
signed char b;
int x, y;
a = 255;
b = a;
x = a;
y = b;
if ( x == y ){ //测试结果应该如何呢?
....
}
2,如同仙子所说,|| 和 or 是两个不同的运算符,它们具有不同的优先级,而了解运算符的优先级是任何一个试图阅读该语言代码的人所应该了解的内容(即使只是为了阅读他人的代码而偶尔接触一下 Perl),同样,举个 C 的例子:
c = 1
d = 2
a, b = c, d
在这里,因为赋值运算的优先级要比逗号运算符高,因此最后一句的作用是实际上是将 c 赋值给了 b,而 a 和 d 的值并没有变。
事有凑巧,这三行代码在 python 中也是合法的,可是 python 中的赋值运算就和 C 的规则不一样,因此 Python 会把最后一句解释成为
c 赋值给 a,d 赋值给 b,那么我作为一个 C 程序员,是否可以理解为 Python 的有些语法规则不符合常规逻辑呢?当然不能这么说!
因为我如果稍微了解一点 Python,就不会犯这种初级错误了。
BTW:Perl 中关于 a, b = c, d 的解释规则和 C 是一样的,因此我作为一个 C 程序员来讲,更容易理解它。虽然不加了解就试图理解也是错误的。 |
|