前言:
介绍了什么是变量,以及如何创建、赋值、取名。还有用示例来说明了Python的小整数对象池,以及深拷贝和浅拷贝。
来源于课堂笔记,可能会有疏忽之处,敬请指正~!
一、变量Variable
1.什么是变量
1. 用来绑定数据对象的标识符。
2. python程序在运行时,用来在内存中保存数据的量,该量是可以改变的
(变量保存在内存,程序与运行也在内存中;CPU和内存交互,数据最小单位是字节Byte)
3. Python中 关联/绑定/引用的含义
i. 变量没有数据类型,不存储数据,仅仅只是指向一个数据
ii. 关联/绑定/引用都是指变量和一个对象的关联关系
4. 交互模式下查看变量的绑定关系:
i. Help(‘__main__’)
5. 变量必须先定义/创建,再使用;(变量是对象)
2.如何创建变量
1. 在第一次给它赋值时创建的;
2. 后来可以进行多次赋值,即为改变变量和对象的绑定关系
(没有覆盖之前的值对象,而是重新建立了新的绑定关系,有新的路线了);
3.如何给变量赋值
变量名 = 值 |
|
变量名 |
是按照规则任取的 |
= |
是赋值运算符 |
值 |
是对象 |
例: A = 10 |
|
这是赋值语句,赋值结果是:把变量A和对象10进行绑定 |
|
A 和 10,都是对象,一切皆对象 |
|
内存中需要有对象10吗? |
需要 |
需要在内存中创建变量吗? |
要创建 |
还有什么动作? |
把A和10绑定(暂时理解为,通过变量找到值/对象;是单向的) |
例 : A = 10 B = 10 |
|
A 和 B 的id是一样,都是10的id |
|
一个变量只能绑定一个对象 |
|
两个变量可以同时绑定同一个对象 |
4.如何给变量取名
a) 变量名开头:只能字母或下划线;
b) 变量名:由字母、下划线或数字构成;
c) 变量名:区分大小写(大小写敏感);
d) 不允许使用python关键字取名;(python解释器预留一些英文词组,有特殊含义或作用)(and else 。。。)
e) 建议:变量命名遵循python的PEP 8规则
5.赋值语句
Variable= expression
Variable1= variable2 = expression
Variable1, variable2, … = 序列 (x,y=100,200)
1. Variable1,variable2,variable3,。。。 = 对象1,对象2,。。。
2. Variable1,variable2,variable3,。。。 =( 对象1,对象2,。。。)
3. Variable1,variable2,variable3,。。。 = [ 对象1,对象2,。。。]
二、小整数对象池
1. CPython中整数-5到256永远存在于小整数池中,不会释放并可重复使用
2. 小整数对象池里面的id 不会变
3. Python中的自动化内存管理
例:A = 10000 B = 20000 A = A + B #发生了什么事儿? (A+B = 30000,将A重新绑定到30000,并回收10000 ) |
例:a = 5 b = 5 a is b >>>返回True (a b 直接从小整数池里面找5,不会重新创建对象;所以a、b绑定的是同一个对象) |
三、深拷贝 和 浅拷贝
浅拷贝 shallow copy |
|
是指在复制过程中,只复制一层变量,不会复制深层变量绑定的对象的复制过程 |
|
L= [ 3.1, 3.2 ] L1 = [1, 2, L] L2 = L1.copy( ) Print(L1) Print(L2) L[ 0 ] = 3.14 Print(L1) Print(L2) |
[1, 2, [ 3.1, 3.2 ] ] [1, 2, [ 3.1, 3.2 ] ] 修改L,跟L1、L2有啥关系?? [1, 2, [ 3.14, 3.2 ] ] #L1 也被改变了 [1, 2, [ 3.14, 3.2 ] ] #L2也被改变了 |
两个列表共用同一个列表L时,当这个列表L被改变后,之前的两个列表内容也会改变。 (因为列表的变量名、列表索引、列表元素对象是通过关系来进行绑定的,所以列表依赖于深层对象) |
|
深拷贝 deep copy |
|
对所有可变对象进行层层复制,实现对象的各自独立 |
|
Import copy #导入复制模块 L= [ 3.1, 3.2 ] L1 = [1, 2, L] L2 = copy.deepcopy(L1) #实现深拷贝 Print(L1) Print(L2) L[ 0 ] = 3.14 Print(L1) Print(L2) |
[1, 2, [ 3.1, 3.2 ] ] [1, 2, [ 3.1, 3.2 ] ] 修改L,跟L1、L2有啥关系?? [1, 2, [ 3.14, 3.2 ] ] #L1 也被改变了 [1, 2, [ 3.1, 3.2 ] ] #L2不受影响 |