Python 是强类型、动态类型的吧?
Opened this issue · 7 comments
《Python 学习笔记》第五章开头(P74)写道「因为 "弱类型" 和 "Duck Type" 的缘故」,但 Python 应该是强类型吧?
参考:
Why is Python a dynamic language and also a strongly typed language
Is Python strongly typed?
你理解的不对。第一种情况是动态类型。
Python就是强类型动态类型的语言。
2016年3月6日 下午6:09,"仇柯人" notifications@github.com写道:
这么看python就是弱类型
a="a"
print a
a
a=1
print a这么看就是强类型
"a"+1
Traceback (most recent call last):
File "", line 1, in
TypeError: cannot concatenate 'str' and 'int' objects—
Reply to this email directly or view it on GitHub
#42 (comment).
弱类型(Javascript):
> "1" + 2
'12'
强类型(Python):
>>> "1" + 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
@choleraehyq,
没错,我理解错了,所以那个评论我就删掉了,怎么还有记录……
=====
是邮箱记录……
嗯,我的描述有些不准确。但因为 python 支持操作符重载缘故,所以具备某些弱类型特征。
In [1]: class X:
...: def __add__(self, other):
...: return other + 100
...:
In [2]: x = X()
In [3]: x + 5
Out[3]: 105
还有一个比较特别的是,__class__
在运行期是可以被改变的,从而转换门庭换个类型。
In [12]: class X: pass
In [13]: class Y: pass
In [14]: x = X()
In [15]: type(x)
Out[15]: __main__.X
In [16]: x.__class__ = Y
In [17]: type(x)
Out[17]: __main__.Y
这个应该给个注解,很多人都有这样的问题
"1" + 2 == "12" 这样的是运算符的性质,和对象的类型系统本身无关
类型系统是没有公认的“强/弱”划分的
一般对“强类型系统”的认识多数集中于“类型检查没有或很少有被欺骗的机会”
从这方面看,python是纯动态的类型系统,而类型系统本身基本上完全保护了所有的对象值,可以认为是属于“强类型系统”特征的
不过“Duck typing”即类型多态性又有意放松了类型兼容性规则,这个方面来说,它又是非常“弱”的