怎么总有人说python是弱类型语言呢??

2013-02-27 22:10:57 +08:00
 crossmaya
python是动态脚本语言

python is not vbscript

我想说的就这么多.....
25145 次点击
所在节点    Python
42 条回复
Narcissu5
2013-03-01 10:21:54 +08:00
隐式转换应该不是弱类型的标志,其实隐式转换也就是隐式调用了toString和valueOf,像C#这种可以通过重载运算符在所有类型之间实现隐式转换,难道C#是弱类型的?

我觉得强弱类型区别在于如何解释内存,弱类型对同一片内存可以解释为不同的类型,强类型在做转换的时候总是返回一个副本。
ruchee
2013-03-01 10:36:18 +08:00
何必纠结,写起来快,运行不要太慢就OK了
seeker
2013-03-01 12:30:14 +08:00
@Narcissu5 嗯,c/c++运行时并不知道int和char的区别,int/char是写给人看的,所以弱类型。
seeker
2013-03-01 12:34:22 +08:00
@aisk 比如Java现在都大量使用接口来增加代码的动态性,并不是说他就动态类型了,编译好了,他的类型就确定了,所以还是静态类型的。
有多个接口,只说明他有多种类型(多态)。
就是因为他的静态特性,才需要接口这种东西人为的编译前给了类型信息,动态类型的话,直接duck typing了,借口可以不要声明。
aisk
2013-03-01 12:56:22 +08:00
@seeker 一般观点也都这么认为的,只是像动态语言靠拢了。不过我觉得像常规认为的动态语言,比如Python,只不过是靠拢到了极致,动态/静态之间并没有**十分明确**的界限。比如Java把所有变量类型都声明为Object或者所有类型都实现一个接口,然后在运行时的时候靠反射一类的方法来做调用,这样也和动态语言差别不是很大了。
seeker
2013-03-01 13:44:00 +08:00
@aisk 嗯,反射的话,是模糊了动态/静态类型的界限。
archsocks
2013-03-01 13:49:41 +08:00
@aisk
>强/弱类型区分已经没那么明显了,
>说Python是强类型,但是他有的时候还是会偷偷的给你做隐式类型转换。

我还不知道python还有这功能,你举个例子让我看看?
aisk
2013-03-01 14:24:41 +08:00
@archsocks

In [1]: a=1

In [2]: type(a)
Out[2]: int

In [3]: a = a + 1l

In [4]: a
Out[4]: 2L
clino
2013-03-01 14:27:45 +08:00
@aisk 对于整形长整形的操作,连c语言都是这样的吧
aisk
2013-03-01 14:38:36 +08:00
@clino 是啊
archsocks
2013-03-01 15:25:16 +08:00
@aisk
int和long,str和unicode不算,因为这二个类型是由于python 2.x的兼容性实现限制而搞出来的,其实应该是一个类型,不能以这个说明python不是强类型。而且在python3里这二个类型被修正成一个类型了。
aisk
2013-03-01 15:49:06 +08:00
@archsocks python3里面float和int相加还是会做隐式类型转换啊…… 而且我也没说这个能说明python不是强类型,只是想说明强弱类型之间的界限没那么明显。
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__,那任何东西和我加都会隐式转换咯
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
binux
2013-03-01 17:39:08 +08:00
@aisk 你没注意到重点,不但id无法说明,也很难说 x+y 的时候,是x自己转换了,还是“+”把它转换了
aisk
2013-03-01 17:52:13 +08:00
@binux 还是没理解……
fansgentle
2013-03-01 20:29:52 +08:00
@cai314494687 变量不需要声明为特定的数据类型的语言是动态类型语言吧。
binux
2013-03-01 21:20:24 +08:00
@binux

class A:
def __add__(self, other):
return 'something'

a = A()
a = a + 1

那么,是a被隐式转换了呢,还是1被隐式转换了?
Zuckonit
2013-03-01 21:25:55 +08:00
强弱针对是否隐式转换
gaodayue
2013-03-02 12:53:18 +08:00
我对强弱类型不太了解,不过静态/动态类型的区别还是很明显的。静态类型语言在运行前就能确定变量的类型并做类型检查(如C/C++, Java),动态类型语言则是在运行时才能知道变量的类型并作类型检查(如python, js)。一个常见的误解是把需不需要声明变量类型来区分静态/动态类型,导致这个误解的原因是他们还没有接触过像ML这类具有类型推导的语言。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/61513

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX