Python 中一切都是对象,变量是对象的引用。
这是一个普遍的法则。我们举个样例来说。Python 是怎样来处理的。
- x = 'blue'
- y = 'green'
- z = x
当 python 运行上面第一句的时候,会在 heap 中首先创建一个 str 对象,其文本内容为 blue。同一时候还创建一个名为 x 的对象引用。x 引用的就是这个 str 对象。
第二句也是类似;第三条创建了一个名为 z 的新对象引用。并将其设置为对象引用 x 所指向的同样对象。例如以下图的变化。
所以看出在 Python 中赋值操作符号 "=" 的作用是,将对象引用和内存中的某个对象进行绑定。假设对象已经存在,就进行简单的又一次绑定。以便引用 "=" 右边的对象;假设对象引用尚未存在。就首先创建对象,然后将对象引用和对象进行绑定。 Python 使用 "动态类型" 机制,也就是说,在 Python 程序中。不论什么时候能够依据须要,某个对象引用都能够又一次绑定到还有一个不同的对象上(不要求是同样的类型)。这和其它强化型语言如(C++,Java) 不太一样,仅仅同意又一次绑定同样类型的对象上。
在 Python 中,由于有 "动态类型" 机制,所以一个对象引用能够运行不同类型的对象适用的方法。当一个对象不存在不论什么对象引用的时候。就进入了垃圾收集的过程。
查看类型程序:
- import types
- type(100)
- >>> a=100
- >>> a/10
- 10
- >>> a[0]
- Traceback (most recent call last):
- File "<pyshell#5>", line 1, in <module>
- a[0]
- TypeError: 'int' object has no attribute '__getitem__'
- >>> a='hello'
- >>> a[0]
- 'h'
- >>> a/10
- Traceback (most recent call last):
- File "<pyshell#8>", line 1, in <module>
- a/10
- TypeError: unsupported operand type(s) for /: 'str' and 'int'
- >>>
Python 会在 heap 创建一个 int 对象。其内容为 100。同一时候创建 a 变量,其值指向 heap 中的 int 对象
第一句 a = 100
第二句 a/10 Python 适用 "动态类型" 机制,推断 a 指向的对象是 int 型,能够适用 /(除法) 操作。
于是便进行运算产生结果。
(它会在 heap 中在创建一个 10.0 的对象么
) 第三句 a[0] Python 适用 "动态类型" 机制,推断 a 指向的对象是 int 型,并不适用 [](分片) 操作。于是就进行报错。 第四句 a = 'hello' Python 会在 heap 创建一个 str 对象。其内容为 hello。同一时候改变 a 变量,使得其值指向 heap 中的 str 对象。同一时候原来的 int 对象。因为不在存在对象引用。所以就进入了垃圾收集过程。
第五句 a[0] Python 适用 "动态类型" 机制,推断 a 指向的对象是 str 型。能够适用 [](分片) 操作。于是便进行运算产生结果。
第六句 a/10 Python 适用 "动态类型" 机制,推断 a 指向的对象是 str 型,并不适用 /(除法) 操作。于是就进行报错。
总之 :在 Python 中一切都是对象,变量总是存放对象引用。当一个对象没有变量指向它的时候,它便进入了垃圾收集过程。Python 的 "动态类型" 机制,负责检查变量的对象引用适用操作。
假设该对象不适用该操作。则会直接报错。一句话 "变量无类型。对象有类型"
1. id():获取的是对象在内存中的地址
2. is :比对 2 个变量的对象引用(对象在内存中的地址。即 id() 获得的值)是否同样。假设同样则返回 True。否则返回 False。
换句话说,就是比对 2 个变量的对象引用是否指向同一个对象。
3. ==:比对 2 个变量指向的对象的内容是否同样。
来源: http://www.bubuko.com/infodetail-2047047.html