簡體   English   中英

遞歸中的python列表行為

[英]Behaviour of python lists in recursion

以下代碼返回提供的數字的所有可能排列。

class Solution:

  def permute(self, numbers, start, result):
        if start == len(numbers):
            print(numbers)
            result.append(numbers[:])
            return
        for i in range(start, len(numbers)):
            numbers[start], numbers[i] = numbers[i], numbers[start]
            self.permute(numbers, start + 1, result)
            numbers[start], numbers[i] = numbers[i], numbers[start]

  def solution(self, numbers):
        result = []
        if not numbers or len(numbers) == 0:
            return numbers
        self.permute(numbers, 0, result)
        return result

res1 = Solution().solution([1, 2, 3])
print(res1)

此實例的最終輸出將是

[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 2, 1], [3, 1, 2]]

但是當我稍微修改permute函數時,輸出完全不同

def permute(self, numbers, start, result):
        if start == len(numbers):
            print(numbers)
            result.append(numbers) #changing this line
            return
        for i in range(start, len(numbers)):
            numbers[start], numbers[i] = numbers[i], numbers[start]
            self.permute(numbers, start + 1, result)
            numbers[start], numbers[i] = numbers[i], numbers[start]

這給出了輸出

[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]

該程序在我使用時有效

result.append([x for x in numbers])

要么

result.append(numbers[:])

但是當我使用

result.append(numbers)

有人可以幫助我了解為什么會這樣嗎?

如果您沒有使用所描述的技術創建對象的副本,則可以一次又一次地將同一對象放入列表中。

這是一個簡短的示例來說明問題:

>>> a=[1,2]
>>> b=[a,a]
>>> a.append(3)
>>> b               #   [[1, 2, 3], [1, 2, 3]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM