6.3我是风儿,我是沙
1.动态类型
动态类型(Dynamic Typing)是Python的另一个重要核心概念。前面说过,Python的变量不需要声明。在赋值时,变量可以重新赋值为其他任意值。
a = 1
在Python中,整数1是一个对象。对象的名字是“a”。但更精确地说,对象名其实是指向对象的一个引用。对象是存储在内存中的实体。对象名是指向这一对象的引用(reference)。借着引用操作对象,就像是用筷子夹起热锅里的牛肉。对象是牛肉,对象名就是那双好用的筷子。
通过内置函数id()能查看到引用指向的是哪个对象。这个函数能返回对象的编号:
a = 1
print(id(1))
print(id(a))
______________
4300382472
4300382472
_____________
#Python中还有一个 getattribute ()特殊方法,用于查询任意属性。
可以看到,赋值之后,对象1和引用a返回的编号相同。
在Python中,赋值其实就是用对象名这个筷子去夹其他的食物。每次赋值时,我们让左侧的引用指向右侧的对象。引用能随时指向一个新的对象:
a=3
print(id(a))
a = "at"
print(id(a))
_____________
4385284424
4380401968
第一个语句中,3是储存在内存中的一个整数对象。通过赋值,引用a指向对象3。第二个语句中,内存中建立对象“at”,是一个字符串。引用a指向了“at”。通过两次的id()返回能发现,引用指向的对象发生了变化。既然变量名是个随时可以变更指向的引用,那么它的类型自然可以在程序中动态变化。因此,Python是一门动态类型的语言。
一个类可以有多个相等的对象。比如两个长字符串可以是不同的对象,但它们的值可以相等。
除了直接打印id外,还可以用is运算来判断两个引用是否指向同一个对象。但对于小的整数和短字符串来说,Python会缓存这些对象,而不是频繁地建立和销毁它们。因此,下面的两个引用指向同一个整数对象3。
a= 3
b= 3
print(a is b)
——————————————-
True