1. 程序内存浅浅析

软件程序(代码)在计算机中执行,主要通过数据单元,控制单元,执行单元共同协作,完成数据的交互,从而达到程序处理数据的目的.在软件程序执行过程中,因为计算机内存和CPU资源的限制,所以要想达到有效的分解软件中的各项数据,高效的运行软件代码,就需要将不同的数据加载到不同的内存部分中,从而实现可以在一个计算机中有效的运行多个软件的目的.

 

PYTHON程序在运行过程中,主要是解释器从系统中申请内存空间以运行PYTHON软件

PYTHON解释器将申请的内存分为以下几部分用于处理执行的程序软件

程序中变量和对象的基本表示方式

例如:有下面这样的一个代码块

 coding=utf-8


class Person():
    # 类型中的代码(属性/方法)
    def __init__(self, name, age):
        self.name = name
        self.age = age


p1 = Person('tom', 18)

那么这个代码块(模块)在内存中的表示如下

具体的就是代码在逐行执行过程中,当执行到类时,解释器会在堆内存区中先预加载类型,当代码执行到p1 = Person(‘tom’ , 18),首先(代码时从右往左执行),是将字符串tom 和 整数18赋值到类中的name和age中(即,类中的属性name, age 指向静态区中的字符串tom,整数18的内存地址)创建一个对象(堆内存区中),在把这个对象的内存地址开头(赋值内p1).这样,变量p1就可以操作对象中数据了

1.1 不可变数据类型和可变数据类型

PYTHON中根据数据是否可以进行修改将数据分为两种数据类型

  1. 不可变数据类型:一般基本数据类型都是不可变数据类型
  2. 可变数据类型:一般的组合数据类型或者自定义数据类型(类)都是可变数据类型

怎样去区别不可变数据类型和可变数据类型?

 

PYTHON中的一切皆是对象.可以通过id()查询对象在内存中的地址

可变数据类型是在声明定义了数据之后,修改数据,但是内存地址不会发生变化

不可变数据类型是在声明定义了数据后,修改数据,变量不会修改原来内存地址下的数据,而是重新指向一个新的地址,原来的数据保留(即内存地址发生变化),这样更加方便程序中的基本数据类型的利用率

因为,我们通过变量去修改了数据,所以两次的a的内存地址不同,但是整型10和12还依旧存在,并且地址没有发生变化(整型 -5~256在解释器运行中就已经缓存完成)

在上面可以看出,一个列表中的数据发生改变,但是列表的内存地址是没有变化的

那么就可以很容易的理解下面的代码的含义了.

# coding=utf-8


def change_data(n):

    n = 20


def change_list(l):

    l.append('hello')


a = 18
change_data(a)
print(a)        # 打印的a的值是多小?

b = [1, 2, 3, 'python']
change_list(b)
print(b)        # 打印的列表b是多少

从前面我们讲述的我们可以知道,一开始变量a指向整型18的内存地址,经过函数的调用,我们把a指向的值当做参数传入函数中,也就是n指向12.在经过函数处理之后.n指向20的内存地址(n的值是20),但是这样一来,我们的a所指向的内存地址(a的值)并没有发生变化,也就是在打印a时,会输出18.

但是,在列表b中却不是这样,我们把列表传入函数后,虽然函数通过操作在列表最后面加入了新数据(修改了原来的数据),但是,内存地址没有发生改变,而b所指向的内存地址也是这个内存地址,所以在打印b时的结果会是[1,2,3,’python’,’hello’]。

 

1.2 代码和代码块

PYTHON中最小的运行单元是代码块,代码块的最小单元是一行代码

在实际开发过程中,需要注意的是python有两种操作方式

  1. 交互模式
  2. IDE开发模式

在交互环境下,每行命令就是一个独立执行的代码块,每个代码块运行会独立申请一次内存,在操作过程中交互模式没有退出的情况下遵循python官方操作标准

如:对基本数据类型进行了基本优化操作,将一定范围内的数据存储在常量区以提升性能

但是在IDE开发模式下,代码封装在模块中,通过python命令运行模块时,模块整体作为一个代码块向系统去申请内存并执行程序,执行过程中对于基本数据类型进行缓存优化操作,

通过 pycharm 工具执行上述代码测试

# coding=utf-8
a = 10
b = 10
print(id(a), id(b))
a = 'hello'
b = 'hello'
print(id(a), id(b))
a = 1000
b = 1000
print(id(a), id(b))
a = 1.2
b = 1.2
print(id(a), id(b))

 id(b))

代码运行结果为:

1451519328 1451519328

3187126122960 3187126122960

3187143682960 3187143682960

3187145741944 3187145741944

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值