最近在刷题时遇到一个问题,添加数组 nums 和添加 nums[:] 会得到不同的输出结果。
写个例子:
nums = [1,2,3,4,5] # 创建一个数组 res = [] res.append(nums) nums[0], nums[4] = nums[4], nums[0] # 交换数组中的元素 res.append(nums) print(res)
以上这个例子,先创建一个包含5个整数的数组 nums,并添加到数组 res 中;接着交换数组 nums 的第1个元素和第5元素,并且添加到数组 res 中,不出意外,结果应该是:
[[1, 2, 3, 4, 5], [5, 2, 3, 4, 1]]
但是,最后的结果是:
[[5, 2, 3, 4, 1], [5, 2, 3, 4, 1]]
但是呢,如果把 res.append(nums) 改成 res.append(nums[:]),像下面这样:
nums = [1,2,3,4,5] # 创建一个数组 res = [] res.append(nums[:]) nums[0], nums[4] = nums[4], nums[0] # 交换数组中的元素 res.append(nums[:]) print(res)
就得到如下结果:
[[1, 2, 3, 4, 5], [5, 2, 3, 4, 1]]
后来想了很久,nums 和 nums[:] 指向的对象不同,nums 是数组的对象,而 nums[:] 是对指数组 nums 的元素,res.append(nums) 是把整个对象添加到 res 中,所以 res = [ nums, nums],当 nums 发生改变时,res 中之前添加的 nums 也会发生改变;
而 res.append(nums[:]) 是把 nums 中的所有元素添加到 res,而非 nums 对象本身。
为了防止以后出现重复错误,写下该博客,让自己加深影响!