一次偶然......
某日晚上,我正在运行刚敲的代码,
突然发现,某个列表的内存id地址出现了"禅让制"一般的操作
就类似这种代码
test3=['Im']
test4=['The last one']
print(id(test4))
test4=test3+test4
test5=[]
print(id(test4))
print(id(test5))
输出的内存id地址是: 1386963072832 A
1386963072256 B
1386963072832 A
当时的我就很纳闷,为何会出现ABA的情况
明明是test4使用两个物理地址,test5使用一个物理地址
结果只有两个地址出现
因此,我猜测:
test4的地址释放后,强加给了test5
二次攻破......
然后,我就试着把test5改成字符串类型
test3=['Im']
test4=['The last one']
print(id(test4))
test4=test3+test4
test5='' #从列表[]改成字符串''
print(id(test4))
print(id(test5))
输出的内存id地址是: 1560005703488 A
1560005702912 B
140735365265120 C
果然,并没有出现ABA式的结果了,但是经过后期观察发现:
只要后面还有列表的定义,之前开辟的地址就不会完全弃用
三次解惑......(众所周知)
list.extend()并不会改变原列表的内存id地址
所以当我使用list.extend()方法进行列表合并时,就不会出现上述现象
test3=['Im']
test4=['The last one']
print(id(test4))
test4.extend(test3) #不使用'+'进行合并
test5=[]
print(id(test4))
print(id(test5))
输出的内存id地址是: 1851399059328 A
1851399059328 A
1851399140608 B
现在test5的内存id地址是系统新开辟的,并没有继承test4的地址 (test4独占不放)
结语:
强制赋值是解决系统压力的一种机制
在编写代码的时候,应该留意列表合并操作的区别