列表切片赋值给另一个变量
今天本想考查一下list切片的问题,但没想到差点把自己坑了。
我把a的一段切片赋值给了b,然后看了一下它们的地址。
再重新做一遍相同的赋值操作,结果a的切片地址和b的地址交换了。
>>>
>>> a = [1,2,3,4,5] # 创建列表a
>>> b = a[1:3] # 把a的一段切片赋值给b
>>>
>>>
>>> id(b) # 查看b的地址
139825038891208
>>>
>>> id(a[1:3]) # 查看a切片的地址
139824894069256
>>>
>>>
>>> b = a[1:3] # 再一次把a切片赋值给b
>>>
>>> id(b) # b的地址变成了之前a切片的地址
139824894069256
>>>
>>> id(a[1:3]) # a切片的地址变成了之前b的地址
139825038891208
>>>
我一时没有反应过来,难道把一段切片赋值给另一个变量会导致它们的地址交换?
后来想明白了,做了下面的测试。
>>>
>>> id(b) # 查看b的地址
139824894069256
>>>
>>> id(a[1:3]) # 查看a切片的地址
139824894069832
>>>
>>> b = a[1:3] # 把a切片赋值给b
>>>
>>> id(b) # b的地址变成了之前a切片的地址
139824894069832
>>>
>>> f = [6,7] # 新创建一个列表f
>>>
>>> id(f) # 此时f的地址变成了之前b的地址
139824894069256
>>>
>>> id(a[1:3]) # a切片的地址是一个新地址
139824894069640
>>>
在把a的切片赋值给b之后,如果又新建一个列表f,这个f的地址就变成原来b的地址了。
原因:
实际上访问a切片时生成了一个新的列表,把它赋值给b,那么b的地址就变成了这个新列表的地址,而b原来的地址自然就释放了。
这个时候如果再访问一次a的切片,那么它又新生成一个列表,这个新生成的列表就刚好把原来b释放的地址使用了。
如果此时不是访问a的切片而是新建一个列表f,那么这个f就会把原来b的地址用掉。在这之后再访问a的切片,那么它新生成的列表使用的就是另外一个新的地址了。
所以不存在什么地址交换,只是一个又一个的列表生成、释放而已。
本作品采用《CC 协议》,转载必须注明作者和本文链接