关于Python的可变、不可变类型及内存管理和变量的理解

    Python某种意义上是一个极为彻底的面向对象语言,所有操作都基于对象,其处理方式因此带来了很多变化。Python为了进行有效的数据和数据内存管理,与很多语言不同的是强化了可变类型和不可变类型的概念,在内存管理上估计也有思路上的根本变化。对每一个程序中使用的具体的值,Python都在内存中为其分配并保留一个特定的区域,给予特定的Id,并赋予固定的值。例如有如下语句:

    a=3

    s=3

    其它语言的处理通常会将a和s处理为两个变量,并为其分配不同的内存,再将相应内存的值设置为3,即有两个内存区域,其值都为3。但Python则完全基于3这个具体的对象,认为整个程序中有且只有一个数值型对象3,这个对象3有固定的数值值3,固定的内存地址和单元,固定的对象id,因此,你如果写如下语句:

    id(3)

    id(a)

    id(s)

    将会获得同样的id值,因为它们都是同一个数值对象3。而语句a=3和s=3仅仅是将变量a和s指向3这个对象而已,所以a和s此时操作的是同一个对象。而如果你又写下下面的语句:

    a=4

    此时Python并不像其它语言一样将变量a的值赋为3,而是认为程序又使用了一个具体的数值对象4,因此为数值对象4执行内存分配等一系列相关操作,然后再将a指向4。从这样的操作模式可以认为Python是一个完全的基于对象(数据)的语言,而不像其它语言基于变量。

    正是基于这种操作模式,Python中的数据类型特别强调可变类型和不可变类型。数字、浮点型、字符串等简单类型都是不可变类型,也被称为标量类型,其值是不可以变化的。同时,Python中的可以包含其它数据类型的容器类型,或者非标量类型,就因此被分别处理为不可变和可变的。4中基本的容器类型中,元组(tuple)是不可变的,而列表(list)、字典(dict)和集合(set)是可变的。此时的一些基本特性应该从上面的处理模式推测出来。例如我们定义了如下的元组和列表:

    t=(1,2,3)

    l=[1,2,3]

    这里t是元组,是不可变的,l是列表,是可变的。对于不可变的元组t,只有count和index这两个不能修改数据的方法。而l则除了有上述两个方法外,还有clear、pop、append、insert等能够修改数据的方法。

但是如果进一步考察t和l的具体数据的使用和处理,和前面所述的基本概念又是一致的。例如我们可以写出下面三个语句:

    id(3)

    id(t[2])

    id(l[2])

    从运行结果可以看到,这三句的id都是一样的,即都指向了3这个数值对象,这也进一步凸显了Python的数据和内存管理模式。这也就是Python反复强调的“引用传递”,不管是列表还是其它什么数据结构,其最终的值的实现都是通过对具体数值对象的指向,即对它们的引用传递实现的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值