记一次浅拷贝的错误

Posted imageSet

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次浅拷贝的错误相关的知识,希望对你有一定的参考价值。

 1 import copy
 2 class Solution(object):
 3     def subsets(self, nums):
 4         """
 5         :type nums: List[int]
 6         :rtype: List[List[int]]
 7         """
 8         result = [[]]
 9         self.generate(0,[],result,nums)
10         return result
11     def generate(self,k,item,result,nums):
12         if k > len(nums)-1:
13             return        
14         item.append(nums[k])
15         result.append(copy.deepcopy(item))#result.append(item)        
16         self.generate(k+1,item,result,nums)
17         item.pop()
18         self.generate(k+1,item,result,nums)

leetcode刷题时遇到了78题Subset,写了上面的代码,在第15行最开始用了注释里的result.append(item),把item的引用(地址)传给了result,结果每次递归result中除了原有的‘[]’元素,其他都同步在变。

下面是nums=[1,2,3]时,使用result.append(item)语句的过程

item: [1]
result: [[], [1]]
item: [1, 2]
result: [[], [1, 2], [1, 2]]
item: [1, 2, 3]
result: [[], [1, 2, 3], [1, 2, 3], [1, 2, 3]]
item: [1, 3]
result: [[], [1, 3], [1, 3], [1, 3], [1, 3]]
item: [2]
result: [[], [2], [2], [2], [2], [2]]
item: [2, 3]
result: [[], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3]]
item: [3]
result: [[], [3], [3], [3], [3], [3], [3], [3]]

下面是深拷贝时的过程

item: [1]
result: [[], [1]]
item: [1, 2]
result: [[], [1], [1, 2]]
item: [1, 2, 3]
result: [[], [1], [1, 2], [1, 2, 3]]
item: [1, 3]
result: [[], [1], [1, 2], [1, 2, 3], [1, 3]]
item: [2]
result: [[], [1], [1, 2], [1, 2, 3], [1, 3], [2]]
item: [2, 3]
result: [[], [1], [1, 2], [1, 2, 3], [1, 3], [2], [2, 3]]
item: [3]
result: [[], [1], [1, 2], [1, 2, 3], [1, 3], [2], [2, 3], [3]]

 

以上是关于记一次浅拷贝的错误的主要内容,如果未能解决你的问题,请参考以下文章

记一次代码错误的排查

记一次Jquery获取值的典型错误

记一次FreeRTOS错误配置导致无法进入临界区

记一次uboot升级过程的两个坑

记一次server2008硬盘故障处理过程

记一次mybatis返回自增主键的低级错误!