【问题标题】:How to give a list variable to two class variable?如何将列表变量赋予两个类变量?
【发布时间】:2019-08-13 07:17:54
【问题描述】:

我使用“复制”来获取两个类变量。但是当后一个函数修改两个变量之一的值时,另一个变量会改变。如何生成两个自变量?

无法导入其他包如 numpy 来解决它。 谢谢各位。

Leetcode 中的第 200 题,岛屿的数量

input_list = [  [0, 1, 1, 1, 0],
                [0, 1, 0, 1, 1], 
                [1, 1, 0, 0, 1], 
                [0, 0, 1, 0, 1]]

class Solution():
    def __init__(self, input_list_ori):
        self.island_count = 0
        self.input_list = input_list_ori.copy()
        # self.input_list_ori = [[0 for j in range(len(self.input_list[0]))]for i in range(len(self.input_list))]
        self.input_list_ori = self.input_list.copy()
        self.dirs = [[-1, 0], [0, 1], [0, -1], [1, 0]]

    def find_connect_one(self):
        assert(len(self.input_list) > 0)
        for i_row in range(len(self.input_list[0])):
            for i_col in range(len(self.input_list)):
                if self.input_list[i_row][i_col] == 1:
                    self.island_count += 1
                    self.dfs(i_row, i_col)
        return self.island_count, self.input_list_ori

    def dfs(self, i_row, i_col):
        self.input_list[i_row][i_col] = 0
        self.input_list_ori[i_row][i_col] = self.island_count

        for dir in self.dirs:
            new_i_row = i_row+dir[0]
            new_i_col = i_col+dir[1]
            if new_i_row >= 0 and new_i_col >= 0 and new_i_row < len(self.input_list) and new_i_col < len(self.input_list[0]):
                if self.input_list[new_i_row][new_i_col] == 1:
                    self.dfs(new_i_row, new_i_col)

solution = Solution(input_list)
print(len(input_list))
island_count, input_list_ori = solution.find_connect_one()
print(island_count)

def dfs(self, i_row, i_col):
    self.input_list[i_row][i_col] = 0
    self.input_list_ori[i_row][i_col] = self.island_count

我希望在这两个列表中获得不同的价值。虽然我是通过“copy”操作符生成的,但它们总是相互影响的。

【问题讨论】:

  • ``` self.input_list_ori = [[0 for j in range(len(self.input_list[0]))]for i in range(len(self.input_list))]```我用它来解决问题,但我认为它并不漂亮。

标签: python list deep-copy


【解决方案1】:

你应该使用copy.deepcopy

更多解释来自documentation

  • 浅拷贝构造一个新的复合对象,然后(在可能的范围内)将对原始对象中的对象的引用插入其中。

  • 深拷贝构造一个新的复合对象,然后递归地将在原始对象中找到的对象的副本插入其中。

您的副本正在参考内部列表创建一个新列表。因此,当您修改内部列表时,有两个列表,self.input_listself.input_list_ori

【讨论】:

  • 实际上,复制操作确实创建了外部列表的副本,但它包含与 tge original 相同的内部列表,因此更新其中一个内部列表会影响两个外部列表的内容。 deepcopy 应该没问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
相关资源
最近更新 更多