问题:
nums = [1,2,3,4,5] # 创建一个数组
res = []
res.append(nums)
nums[0], nums[4] = nums[4], nums[0] # 交换数组中的元素
res.append(nums)
print(res)
[[5, 2, 3, 4, 1], [5, 2, 3, 4, 1]]
为什么是上述结果,而不是[[1, 2, 3, 4, 5], [5, 2, 3, 4, 1]] ?
实验分析:
实验1:
temp = [1,2,3,4,5] # 创建一个数组
nums1 = [1,3,5]
nums2=[2,4,6]
#不同赋值方式
nums1=temp #方式1
nums2[:]=temp #方式2
赋值前
赋值后
Id地址
temp = [1,2,3,4,5] #Id of temp:1890381280960
nums1 = [1,3,5] #Id of nums1:1890381306240
nums1=temp #Id of nums1:1890381280960
nums2=[2,4,6] #Id of nums2:1890381306112
nums2[:]=temp #Id of nums2:1890381306112
实验1:由此可见,nums1=temp 只是修改了nums1指向的对象地址,由 [1,3,5]对象变更为[1,2,3,4,5]。nums2[:]=temp依旧指向自身对象[2,4,6]地址,但是修改了元素本身。
实验2:
temp = [1,2,3,4,5] # 创建一个数组
nums1 = [1,3,5]
nums2=[2,4,6]
nums1=temp
nums2=temp[:]
赋值前
赋值后
Id地址
temp = [1,2,3,4,5] #Id of temp:2016601260864
nums1 = [1,3,5] #Id of nums1:2016601290240
nums1=temp #Id of nums1:2016601260864
nums2=[2,4,6] #Id of nums2:2016601290112
nums2=temp[:] #Id of nums2:2016601290240
实验2:由此可见,nums1=temp 只是修改了nums1指向的对象地址,由 [1,3,5]对象变更为[1,2,3,4,5]。nums2=temp[:],开辟了新的内存空间指向了另外一个地址(暂时理解为,nums2指向一个地址,元素赋值时只能开辟新的内存空间储存元素,然后将nums指向这个地址,与nums1释放前的地址相同应属于偶然)