当变量的内容相同时,什么时候是开辟了新的空间,什么时候又是指向同一地址呢?
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是分片拷贝下来的,是独立开辟了新空间的,所以三个变量指向两个值。
当list1发生改变时,变化的其实是它所指向的值,由于list2同样指向了那个值,所以list2也改变了,而list3不发生变化。
在为已经赋值的变量指定另一个名字时(也就是把变量赋值给另一个变量),其实只是添加了一个新的标签而已。两者指向的是同一个值。当“值”发生改变的时候,指向其的多个标签(对应的值)也就会全部改变。
所学不深,如有错误,欢迎指正。