Python 变量和对象
更多资料下载,冲击月薪过万,一线经验工程师录制,
干货满满的嵌入式视频教程,请点击淘宝店:wanglitao.taobao.com
变量和与对象的关系
在C语言中,有指针的概念,我们可以定义一个指针变量p,指针变量的值是另一个变量a的地址,我们就说该指针p指向a这个变量。当我们通过指针p对这个地址进行操作时,其实就是对a进行操作。
#include <stdio.h>
int main()
{
int a = 10;
int *p = &a;
printf("&p=%x\n *p=%d\n p=%x\n &a=%x\n a=%d\n", &p, *p, p, &a, a);
printf("-----------------------\n");
p = p+4;
a = a+4;
printf("&p=%x\n *p=%d\n p=%x\n &a=%x\n a=%d\n", &p, *p, p, &a, a);
return 0;
}
运行结果如下:
root@ubuntu:/home/walkrain/c# ./test
&p=cee62658
*p=10
p=cee62654
&a=cee62654
a=10
-----------------------
&p=cee62658
*p=0
p=cee62664
&a=cee62654
a=14
通过程序,我们可以分析到指针p和变量在内存中的关系如下:
当进行加4操作时,内存关系如下:
我们可以看到,当指针和变量a都进行加4操作时,对于p指针来说,其指向的a变量在内存地址的偏移16个字节的地址,而p自己作为一个变量,内存给其分配的地址0xcee62658是不变的。所以我们可以看到,一个指针变量的指针和变量在内存中的关系是怎么样的。
在Python中,当我们给一个变量i=10赋值时,是怎么样的一个过程呢?
Python这种动态模型语言,与传统的C、C++静态编译类型语言不同。Python会通过三步动作来完成这个赋值的操作:
- 1)在内存中创建一个对象来代表10.
- 2)创建一个变量i,如果先前已经创建,此步省略。
- 3)将变量i与新的对象3建立连接。
在这个过程中,变量和对象保存在内存中的不同部分,并通过连接建立关联。变量总是连接到对象,并且绝不会连接到其他变量上。
在Python中,从变量到对象的连接称为引用。引用可以看做是一种关系,类似C语言中的指针的概念,在内存中以指针的形式实现。一旦变量被引用,Python自动跟随这个变量到对象的连接。这样,三者的概念就很清楚了:
- 1)变量是一个系统表的元素,拥有指向对象的连接的空间
- 2)对象是被分配的一块内存,有足够的空间去表现他们所代表的值。
- 3)引用是自动形成的从变量到对象的指针。
下面通过一个简单的例子来加深理解:
>>> a= b = 10
>>> a,b
(10, 10)
>>> a = 8
>>> a,b
(8, 10)
>>> a = 4
>>> a,b
(4, 10)
>>>
我们定义a,b两个变量同时关联一个对象3,然后我们将a重新赋值,此时a就会关联关联另一个对象,当一个对象没有变量关联,即引用次数为0时,Python会通过对象的垃圾回收机制将其释放。
列表的引用
由前面的学习可以知道,列表是支持在原处修改的,我们再看一个列表的共享引用:
>>> list1=[1,2,3]
>>> list2=list1
>>> list1,list2
([1, 2, 3], [1, 2, 3])
>>> list1=24
>>> list1,list2
(24, [1, 2, 3])
可以看到,当list1重新赋值时,会关联到另外一个对象,不会改变list2的值。
下面这个例子:
>>> list1=[1,2,3]
>>> list2 = list1
>>> list1,list2
([1, 2, 3], [1, 2, 3])
>>> list1[0] = 55
>>> list1,list2
([55, 2, 3], [55, 2, 3])
>>>
《Linux三剑客》视频教程,从零开始快速掌握Linux开发常用的工具:Git、Makefile、vim、autotools、debug,免费赠送C语言视频教程,C语言项目实战:学生成绩管理系统。详情请点击淘宝链接:Linux三剑客