列表切片赋值给另一个变量

今天本想考查一下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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!