2016-09-14 5 views
2

Я работаю на эту проблему leetcode:Рекурсия python проходит по ссылке или по значению?

Given a set of distinct integers, nums, return all possible subsets. 
input =[1,2,3] 
output =[[],[3],[2],[2,3],[1],[1,3],[1,2],[1,2,3]] 

У меня есть C++ решения, которое принимается, а затем я закодирован точно такое же решение питона.

class Solution(object):  
    def subsets(self, nums): 
     """ 
     :type nums: List[int] 
     :rtype: List[List[int]] 
     """ 
     solutions = [] 
     self._get_subset(nums, 0, [], solutions) 

     return solutions 

    @staticmethod 
    def _get_subset(nums, curr, path, solutions): 
     if curr>= len(nums): 
      solutions.append(path) 
      return 

     path.append(nums[curr]) 
     Solution._get_subset(nums, curr+1, path, solutions) 

     path.pop() 
     Solution._get_subset(nums, curr+1, path, solutions) 

Выход теперь: [[], [], [], [], [], [], [], []]

Кажется, это Python проход по reference/pass по значению, вызывающему проблему, но я не могу понять, как это сделать. То же самое с ++ код работает нормально:

class Solution { 
public: 
vector<vector<int>> subsets(vector<int>& nums) { 
    vector<vector<int>> solutions; 
    vector<int> path; 

    _get_path(nums, 0, path, solutions); 
    return solutions; 
} 

void _get_path(vector<int>& nums, 
       int curr, 
       vector<int>& path, 
       vector< vector<int> > &solutions) 
{ 
    if(curr >= nums.size()){ 
     solutions.push_back(path); 
     return; 
    } 
    path.push_back(nums[curr]); 
    _get_path(nums, curr+1, path, solutions); 

    path.pop_back(); 
    _get_path(nums, curr+1, path, solutions); 
} 
}; 
+1

'path' передается по ссылке, так что вы всегда только манипулируя тот же экземпляр. pass 'path [:]' передать копию, которую вы можете изменить – njzk2

ответ

4

Проблема здесь:

solutions.append(path) 

в C++, vector::push_back делает копию path (внутренне). Но в Python все является ссылкой. Таким образом, вы создаете свой solutions как список многих ссылок на тот же path, который в конечном итоге сводится к нулю.

Вы хотите копию:

solutions.append(list(path)) 

или:

solutions.append(path[:])