浅析Python变量的地址空间是如何分配的

问题

当变量的内容相同时,什么时候是开辟了新的空间,什么时候又是指向同一地址呢?

PS:嘻嘻,知道有人只想知道答案而已,所以我就把答案放到最前面啦,你们就不用拉到最后啦,看不懂解答的朋友可以看看实例哟

解答

以Python中的list为例,用***分片***list2=list1[:]拷贝list3=copy.copy(list1)等方法时,是开辟了新的空间的,即虽然这三个列表的内容都相同,但list1、list2与list3都是有自己的空间的

如果是用等号直接赋值的话,就是指向同一地址的。

实例

源代码:

list1 = [3,5,4,1,9,6,2]   #原始对象

list2 = list1             #直接赋值
list3 = list1[:]          #分片,从0取到末尾,相当于复制了整个列表

#打印3个列表
print ('list1=',list1)
print ('list2=',list2)
print ('list3=',list3)

list1.sort()              #将列表中的数字从左至右按照从小到大的顺序重新排序

#再次打印3个列表
print ('在list1重新排序后的list1=',list1)
print ('在list1重新排序后的list2=',list2)
print ('在list1重新排序后的list3=',list3)

运行结果:

list1= [3, 5, 4, 1, 9, 6, 2]
list2= [3, 5, 4, 1, 9, 6, 2]
list3= [3, 5, 4, 1, 9, 6, 2]
在list1重新排序后的list1= [1, 2, 3, 4, 5, 6, 9]
在list1重新排序后的list2= [1, 2, 3, 4, 5, 6, 9]
在list1重新排序后的list3= [3, 5, 4, 1, 9, 6, 2]

从运行结果中可以看到一开始list1和list2、list3中的内容是一样。但是将list1重新排序后,list1和list2中存放的内容还是相同的,list3却还是原来的序列。

讲解

list2 = list1,是直接赋值的,相当于list2是list1的一个别名,所以他们指向同一个空间。
而list3是分片拷贝下来的,是独立开辟了新空间的,所以三个变量指向两个值。
浅析Python变量的地址空间是如何分配的_第1张图片

当list1发生改变时,变化的其实是它所指向的值,由于list2同样指向了那个值,所以list2也改变了,而list3不发生变化。
浅析Python变量的地址空间是如何分配的_第2张图片

总结

在为已经赋值的变量指定另一个名字时(也就是把变量赋值给另一个变量),其实只是添加了一个新的标签而已。两者指向的是同一个值。当“值”发生改变的时候,指向其的多个标签(对应的值)也就会全部改变。

所学不深,如有错误,欢迎指正。

你可能感兴趣的:(Python笔记)