软件程序(代码)在计算机中执行,主要通过数据单元,控制单元,执行单元共同协作,完成数据的交互,从而达到程序处理数据的目的.在软件程序执行过程中,因为计算机内存和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中根据数据是否可以进行修改将数据分为两种数据类型
- 不可变数据类型:一般基本数据类型都是不可变数据类型
- 可变数据类型:一般的组合数据类型或者自定义数据类型(类)都是可变数据类型
怎样去区别不可变数据类型和可变数据类型?
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有两种操作方式
- 交互模式
- 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 |