1
bhuztez 2013-02-27 22:13:22 +08:00
因为他们不懂强类型弱类型和静态类型动态类型有啥区别
其实Python大部分时候是强类型语言,有那么几个角落有那么点弱类型 |
2
binux 2013-02-27 22:15:49 +08:00
他们想的弱类型和你想的弱类型不一样罢了
|
3
jybox 2013-02-27 22:19:50 +08:00
还有人说C是弱类型语言呢~
|
4
xavierskip 2013-02-27 22:30:00 +08:00
确实应该是动态类型,而不是弱类型。
|
7
cai314494687 2013-02-28 10:52:00 +08:00
变量不需要声明为特定的数据类型的语言就是弱语言。
|
8
LTaoist 2013-02-28 11:03:37 +08:00 1
C是典型的静态类型弱类型语言。python是典型的动态类型强类型语言。
静态类型动态类型说的是变量的类型十分可以改变。针对的是变量的类型。 弱类型强类型值得是变量的具体的值是否是有固定的类型的,是否可以改变。 C的变量是不可以改变类型的,所以是强类型。但是强制类型转换可以发生,一个整数可以强制解读为浮点数,等等,所以是弱类型的。python的变量可以改变类型,是动态类型的。但是其绑定的实体是不会改变类型的,即使是把dict转换为list,参与的其实是两个值的实体了,没有发生真正的类型转换。 大部分动态类型的语言都是强类型的,只有C这种接近底层的语言才比较容易是弱类型。 应该是这样吧? |
9
keakon 2013-02-28 11:23:21 +08:00
@cai314494687
没有弱语言这种玩意。 弱类型语言是指变量的类型可以被隐式转换。而 Python 不允许,所以它是强类型语言。 这里有个例子: http://www.zhihu.com/question/20224705/answer/14394999 |
10
haohaolee 2013-02-28 11:27:14 +08:00
没有绝对的弱与强,只有比较,才能说谁更弱谁更强
|
11
yegle 2013-02-28 11:31:08 +08:00
不是说只要存在隐式类型转换的语言就是动态语言么笑…
|
12
aisk 2013-02-28 11:31:23 +08:00 1
强/弱类型区分已经没那么明显了,说Python是强类型,但是他有的时候还是会偷偷的给你做隐式类型转换。本来这个定义就是先有语言实现,再有后来的人给划分,非要分类总是还会有争议的。
@cai314494687 这种说法完全不正确,像Haskell或者go等等有类型推导的语言,很多情况也不需要你声明变量类型,但是变量的类型确实是在运行时前就确定的了,其实是编译器做了这部分工作。 @LTaoist 你自己说的矛盾了啊。。。你的观点c是强类型还是弱类型?而且现在很多人认为js是弱类型的啊,这个和是否动态语言/是否接近底层没关系。 |
14
BOYPT 2013-02-28 12:56:54 +08:00
因为这么说的人就不知道什么叫弱类型。我接触过的语言里面只有php和javascript有弱语言特性:
1000 == "1000" 而且因为这种特性经常被人诟病,绝大多数情况都要写成 === 恒等。 |
15
FrankHB 2013-02-28 13:05:20 +08:00
C是强类型的,只不过不怎么彻底。C的弱类型一面表现在有限的compatible type允许省略部分类型限制而不是随便什么转换(要说转换,反而正好说明强类型的,因为除了UB外的操作意义明确且都不会导致类型错误)。至于所谓强制(coercion)根本就不是C的概念。
http://tieba.baidu.com/p/1398718411?pid=17001826896&cid=0#17001826896 |
16
ooscrewyou 2013-02-28 15:02:24 +08:00
看了下Wikipeadia把Python歸爲強類型語言
The object-oriented programming languages Smalltalk, Ruby, Python, and Self are all "strongly typed" in the sense that typing errors are prevented at runtime and they do little implicit type conversion, but these languages make no use of static type checking: the compiler does not check or enforce type constraint rules. 不過strong typed是打引號的。 Python裏面 >>> 1 == 1.0 True >>> 1 + 1.1 2.1 ML系的帶類型推倒的靜態語言是嚴格區分整數和浮點數的 # 1 + 1.;; Error: This expression has type float but an expression was expected of type int 不過樓主說Python是腳本語言是不對的,只要你願意,完全可以寫一個Python編譯器出來。沒有腳本語言的說法,只是說某個語言的實現是腳本運行的。 |
17
crossmaya OP 膜拜大神们 学习了.
|
19
reusFork 2013-03-01 09:30:49 +08:00 via Android
类型的强弱是没有明确的边界的,所以存在两可的区域,争论这个没有多大意义
静态类型和动态类型就有明确的区分边界 |
21
Narcissu5 2013-03-01 10:21:54 +08:00 1
隐式转换应该不是弱类型的标志,其实隐式转换也就是隐式调用了toString和valueOf,像C#这种可以通过重载运算符在所有类型之间实现隐式转换,难道C#是弱类型的?
我觉得强弱类型区别在于如何解释内存,弱类型对同一片内存可以解释为不同的类型,强类型在做转换的时候总是返回一个副本。 |
22
ruchee 2013-03-01 10:36:18 +08:00
何必纠结,写起来快,运行不要太慢就OK了
|
24
seeker 2013-03-01 12:34:22 +08:00
@aisk 比如Java现在都大量使用接口来增加代码的动态性,并不是说他就动态类型了,编译好了,他的类型就确定了,所以还是静态类型的。
有多个接口,只说明他有多种类型(多态)。 就是因为他的静态特性,才需要接口这种东西人为的编译前给了类型信息,动态类型的话,直接duck typing了,借口可以不要声明。 |
25
aisk 2013-03-01 12:56:22 +08:00 1
@seeker 一般观点也都这么认为的,只是像动态语言靠拢了。不过我觉得像常规认为的动态语言,比如Python,只不过是靠拢到了极致,动态/静态之间并没有**十分明确**的界限。比如Java把所有变量类型都声明为Object或者所有类型都实现一个接口,然后在运行时的时候靠反射一类的方法来做调用,这样也和动态语言差别不是很大了。
|
27
archsocks 2013-03-01 13:49:41 +08:00
|
28
aisk 2013-03-01 14:24:41 +08:00
|
31
archsocks 2013-03-01 15:25:16 +08:00
@aisk
int和long,str和unicode不算,因为这二个类型是由于python 2.x的兼容性实现限制而搞出来的,其实应该是一个类型,不能以这个说明python不是强类型。而且在python3里这二个类型被修正成一个类型了。 |
32
aisk 2013-03-01 15:49:06 +08:00
@archsocks python3里面float和int相加还是会做隐式类型转换啊…… 而且我也没说这个能说明python不是强类型,只是想说明强弱类型之间的界限没那么明显。
|
33
binux 2013-03-01 16:21:47 +08:00
@aisk
实际上 In [1]: a = 1 In [2]: id(a) Out[2]: 140379290666840 In [3]: a = a + 1l In [4]: id(a) Out[4]: 4513106928 In [5]: a Out[5]: 2L 我觉得这不能完全说明这里确实做了类型转换,比如我重载__add__,那任何东西和我加都会隐式转换咯 |
34
aisk 2013-03-01 16:58:36 +08:00
@binux a的id会变是是另外一回事了,跟当前讨论问题无关。python里面int也是堆上分配的,并没有在栈上,为了减少频繁malloc的开销,小整数(目前版本是-5到2xx,具体忘了)会做一个全局缓存,之后a指向的对象是整型2,地址自然会改变了,可以看这里:
In [1]: a=1 In [2]: id(a) Out[2]: 137679024 In [3]: a+=1 In [4]: id(a) Out[4]: 137679012 In [5]: b=1 In [6]: id(b) Out[6]: 137679024 In [7]: id(1) Out[7]: 137679024 |
37
fansgentle 2013-03-01 20:29:52 +08:00
@cai314494687 变量不需要声明为特定的数据类型的语言是动态类型语言吧。
|
38
binux 2013-03-01 21:20:24 +08:00
|
39
Zuckonit 2013-03-01 21:25:55 +08:00
强弱针对是否隐式转换
|
40
gaodayue 2013-03-02 12:53:18 +08:00
我对强弱类型不太了解,不过静态/动态类型的区别还是很明显的。静态类型语言在运行前就能确定变量的类型并做类型检查(如C/C++, Java),动态类型语言则是在运行时才能知道变量的类型并作类型检查(如python, js)。一个常见的误解是把需不需要声明变量类型来区分静态/动态类型,导致这个误解的原因是他们还没有接触过像ML这类具有类型推导的语言。
|
41
lldong 2013-03-02 13:03:48 +08:00
类型系统科普贴 What to know before debating type systems
http://blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html |