想要弄清楚内存相关的问题,就要理清楚:变量、内存地址、值之间的关系:
1.程序里什么时候分配新的内存地址?
答:1.定义一个变量,内存就开辟一个内存空间,分配一个内存地址.
特殊:
如:a=687
a=197
print(a)# 输出197
这是2内存个地址,输出a,是输出第二a的个值,a指向值为197的内存地址,第一个a的值687 还存在,但是a不指向它了,
2.一个列表里的变量存放的是啥?
答:放的是变量的内存地址
3.变量的类型可以是哪些?
答:整数,字符串,列表,字典,元组,所有数据类型
4.判断操作是 赋值 还是 修改变量的值?
答:4.1 如果是赋值则:开辟新的内存空间,分配新的内存地址(python小数据池除外)
请体会如下3种赋值的不同
第一种:开辟了新的内存空间
第二种:赋值是把v1的内存地址给v2
第三种:(记)python小数据池中只要数值相同,内存地址就相同,这是python的缓存机制
4.2 如果是修改变量本身的值:
5.python的小数据池对内存地址的影响?
答:数据范围以内的数[-5,256],只要数值相同,内存地址就相同
补充:
# 按理 v1 和 v2 应该是不同的内存地址。特殊:
1. 整型: -5 ~ 256
2. 字符串:"alex",'asfasd asdf asdf d_asdf ' ----"f_*" * 3 - 重新开辟内存
6.python变量数值垃圾回收机制
如 a=30
a=20
a被赋了新值 20 ,之前的值 30 会被解释器垃圾回收机制自动 回收
################################## 分隔符 #####################################
变量是为了写代码方便理解,其实是变量指向一个值的内存地址,
重新赋值,原来的值没有改,还在内存中,只是没有变量,指向它的内存地址了,
一个值对应一个内存地址,两个一样的值也是2个地址(python小数据池除外)
1.不可修改的数据类型,string...等、或其他 内置函数 操作后 ,产生新的值, 旧值没有改变,新值没有变量指向
################################## 分隔符 #####################################
'''
23. v1 = '人生苦短,我用Python' # v1 是一个变量,指向'人生苦短,我用Python'的内存地址
v2 = [1,2,3,4,v1] #注 这里的v1,放的是v1的内存地址,
v1 = "人生苦短,用毛线Python"
print(v2)
# 输出 [1, 2, 3, 4, '人生苦短,我用Python']
解释:v1 = "人生苦短,用毛线Python" 是对v1 赋值,在内存中开辟了一个新的内存空间,即第一个v1 和 第二个 v1 的内存地址不一样,
而 v2中元素v1存放的是第一个v1的内存地址所对应的值。
'''
'''
24. 看代码写结果并解释原因
data_list = []
data = {}
for item in range(10):
data['user'] = i
data_list.append(data)
print(data_list)
输出:[{'user':9},{'user':9},{'user':9},{'user':9},...] 一共9个
解释:data是指向一个内存地址,append是把data添加到空列表data_list,
data_list = [data,data,data,data,data,data,data,data,data,data]
data指向一个内存地址,内存地址的下的值被修改,所以最后data={'user':9}
data_list=[{'user':9},{'user':9},{'user':9},{'user':9},...] 一共9个
'''
'''
25. 看代码写结果并解释原因
data_list = []
for item in range(10):
data = {}
data['user'] = i
data_list.append(data)
print(data_list)
输出: [{'user':0},{'user':1},{'user':2},{'user':3},{'user':4},{'user':5},,{'user':6},{'user':7},{'user':8},{'user':9}]
每次循环经过data = {} ,都添加加一个新的字典变量,开辟一个新的内存地址,再对字典添加键值对,最后追加到列表data_list中