В чем разница между listA.append (listB [:]) и listA.append (listB)? - PullRequest
0 голосов
/ 25 января 2019

Пробовал python 3 возврат в leetcode.Для приведенного ниже кода ans.append (стек [:]) работает, но ans.append (стек) нет.

Заранее спасибо.

Leetcode.

def combine(self, n, k):
    """
    :type n: int
    :type k: int
    :rtype: List[List[int]]
    """
    nums = list(range(1,n+1))
    ans = []
    stack = []

    def backtracking( current_pos = 0, current_in_tuple = 0, rest = n):
        if current_in_tuple == k:
            ans.append(stack)
            return
        if rest + current_in_tuple < k:
            return

        for i in range(current_pos, n-k+current_in_tuple+1):
            stack.append(nums[i])
            backtracking(i+1, current_in_tuple+1, rest-1)
            stack.pop()


    backtracking()

    return ans

Ввод: 4,2

Actual:[[],[],[],[],[],[]]
Expected:[[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Разница в том, что listA.append(listB) добавляет мелкую копию списка B в listA, что означает, что если впоследствии listB будет изменен (т. Е. Путем вызова listB.pop()), это изменение также произойдет в listA.

Но listA.append(listB[:]) делает полностью независимую копию, без связи с исходным списком B.

0 голосов
/ 25 января 2019

Я дам вам несколько советов для его отладки, stack[:] создает новый массив, в то время как stack ссылается на тот же массив, который вы можете проверить, сравнивая id обоих, которые видят точку в другом месте в память

In [1]: a=[1,2,3]

In [2]: id(a)
Out[2]: 139944147306568

In [3]: id(a[:])
Out[3]: 139944156641672

Вы можете видеть, что в примере ниже, что на самом деле происходит внутри вашего массива результатов

In [4]: b=[]

In [5]: b.append(a)

In [6]: b
Out[6]: [[1, 2, 3]]

In [7]: a[0]=400

In [8]: b
Out[8]: [[400, 2, 3]]

Обратите внимание, что b изменяется после того, как вы изменили a, поэтому код получает неправильный вывод

Надеюсь, вы найдете это полезным:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...