0%

面试中考了一道题,题目如下:
在Python环境中运行

1
2
print(1 + "9")
print("9" + 1)

会出现什么?
一开始很困惑,当我自己去跑一遍之后发现,解释器会报错

1
TypeError: unsupported operand type(s) for +: 'int' and 'str'

我突然才意识到,这里涉及的强类型语言和弱类型语言的区别


强类型语言

  • 强类型语言又称为强类型定义语言,要求所有的变量都有强制定义,之后才能使用,而且一旦声明之后,如果不经过强制转换,那么它就永远是这个数据类型了。
  • 一般也不允许不同类型的不同类型的变量互相进行运算
  • 比如Java,C++,Python就属于强类型语言

弱类型语言

  • 弱类型语言又称弱类型定义语言,与强类型语言相反,允许不同类型的变量进行相互运算
  • 比如在VBScript中,可以将字符串‘12’和整数3进行连接得到字符串‘123’,然后可以把它看成整数123,而不需要显示转换。

强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。

关于动态语言和静态语言

所有的编程语言都是需要先经过编译之后才能供机器使用的

动态语言

  • 动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。
  • Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言

静态语言

  • 静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型。
  • C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。

动态语言易上手,而且无需事先将所有变量都申明好,而静态语言的好处是运行速度会比动态语言快

Python 属于强类型的动态脚本语言

  1. object 公共方法

  2. _object 半保护

    被看作是“protect”,意思是只有类对象和子类对象自己能访问到这些变量,在模块或类外不可以使用,不能用’from module import * 导入。

  3. _ _ object 全私有,全保护

    __object 是为了避免与子类的方法名称冲突, 对于该标识符描述的方法,父类的方法不能轻易地被子类的方法覆盖,他们的名字实际上_classname__methodname。

  1. _ _ object_ _ #内建方法,用户不要这样定义

先来看题:

1
2
3
4
5
kvps = {'1':1,'2':2}
theCopy = kvps.copy()
kvps['1'] = 5
sum = kvps['1'] + theCopy['1']
print(sum)

最后输出什么呢
答案是6
这就是copy()和deepcopy()的区别了
贴三张图就明白了

  1. a = b直接赋值,指向同一个对象

a和b指向同一个对象
2. b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)

他们的子对象还是指向统一对象
3. b = a.deepcopy():深拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。

两者是完全独立的