先看一段代码:
l1 = []
for i in range(5):
l1.append(i)
print '--- l1: ', l1
l2 = []
a = 0
for i in range(5):
a = i
l2.append(a)
print '--- l2: ', l2
l3 = []
a = '0'
for i in range(5):
a = str(i)
l3.append(a)
print '--- l3: ', l3
l4 = []
for i in range(5):
a = {'num': i}
l4.append(a)
print '--- l4: ', l4
l5 = []
a = {'num': 0}
for i in range(5):
a['num'] = i
l5.append(a)
print '--- l5: ', l5
l6 = []
a = [0]
for i in range(5):
a[0] = i
l6.append(a)
print '--- l6: ', l6
以下是运行结果:
--- l1: [0, 1, 2, 3, 4]
--- l2: [0, 1, 2, 3, 4]
--- l3: ['0', '1', '2', '3', '4']
--- l4: [{'num': 0}, {'num': 1}, {'num': 2}, {'num': 3}, {'num': 4}]
--- l5: [{'num': 4}, {'num': 4}, {'num': 4}, {'num': 4}, {'num': 4}]
--- l6: [[4], [4], [4], [4], [4]]
通过上面的结果,简单的理解就是,对于不可变数据类型(数字、字符串和元组),改变它的值就是重新开辟一块内存空间;对于可变数据类型(列表、字典),改变它就是改变它对应的内存空间里的值。
通过id()函数我们可以知道一个对象的内存地址,在上面的代码中加入id()函数看一下内存地址的变化:
l2 = []
a = 0
for i in range(5):
a = i
print id(a)
l2.append(a)
print '--- l2: ', l2
l3 = []
a = '0'
for i in range(5):
a = str(i)
print id(a)
l3.append(a)
print '--- l3: ', l3
l4 = []
for i in range(5):
a = {'num': i}
print id(a)
l4.append(a)
print '--- l4: ', l4
l5 = []
a = {'num': 0}
for i in range(5):
a['num'] = i
print id(a)
l5.append(a)
print '--- l5: ', l5
l6 = []
a = [0]
for i in range(5):
a[0] = i
print id(a)
l6.append(a)
print '--- l6: ', l6
运行结果:
30900880
30900856
30900832
30900808
30900784
--- l2: [0, 1, 2, 3, 4]
35729120
31184176
35725440
31184136
31183536
--- l3: ['0', '1', '2', '3', '4']
36806728
36807000
36808904
36807272
36808088
--- l4: [{'num': 0}, {'num': 1}, {'num': 2}, {'num': 3}, {'num': 4}]
36808632
36808632
36808632
36808632
36808632
--- l5: [{'num': 4}, {'num': 4}, {'num': 4}, {'num': 4}, {'num': 4}]
36755272
36755272
36755272
36755272
36755272
--- l6: [[4], [4], [4], [4], [4]]
通过打印的结果可以知道,列表和字典的内存地址一直没有变,也许会问为什么l4里面的5个字典对象不一样,那是因为每次for循环都重新创建了一个字典对象,l5没变是因为前面已经创建过一个字典对象a,python为了节省内存空间,后面的for循环并没有重新建立新的字典对象。
相关参考资料:
https://blog.csdn.net/wjc_fantasy/article/details/77936148
https://blog.csdn.net/dan15188387481/article/details/49864613