Python 变量和对象

变量和与对象的关系

在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三剑客