二维的数组复制

我在 class 中定义了三个方法#

  1. new: 设置 data = [[1,2,3],[4,5,6],[7,8,9]], 保留 data 原值在 data_backup 中#

  2. renew: 删去 data 中的 [1,2,3], 再利用 data_backup 还原 data#

  3. change: 改变 data 的内容#

    结果 data_backup 的内容也变了,确认 data 与 data_backup 的 id address 是不一样的#

    请问这是怎么回事?
    #

另外:#

我以 self.data_backup = [self.data [i] for i in range (3)] 来作数组备份,#

但是用 self.data_backup = self.data [:] 的方式,结果也是一样.#

class database():
    def __init__(self):
        self.a = 10
         self.b = 100

    def new(self):
        self.data = [[1,2,3],[4,5,6],[7,8,9]]
        self.data_backup = [self.data[i] for i in range(3)]
         print(id(self.data), self.data)
         print(id(self.data_backup), self.data_backup)

    def renew(self):
        self.data.remove([1,2,3])
        self.data = [self.data_backup[i] for i in range(3)]
        print(id(self.data), self.data)
        print(id(self.data_backup), self.data_backup)

    def change(self):
        self.data[0][1] = 999
        print(id(self.data), self.data)
        print(id(self.data_backup), self.data_backup)

db = database()
db.new()
db.renew()
db.change()

new:
129230600 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
129233352 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
renew:
126829768 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
129233352 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
change:
126829768 [[1, 999, 3], [4, 5, 6], [7, 8, 9]]
129233352 [[1, 999, 3], [4, 5, 6], [7, 8, 9]]
Jason Yang
最佳答案

进行复制时,使用 self.data_backup = [self.data [i] for i in range (3)]self.data_backup = self.data [:] 为浅复制,需要使用 copy 模块中的 deepcopy() 函数实现深复制。

可在 Python Tutor 中以可视化的方式查看 http://pythontutor.com/.

5年前 评论
Jason990420 (楼主) 5年前
讨论数量: 1

进行复制时,使用 self.data_backup = [self.data [i] for i in range (3)]self.data_backup = self.data [:] 为浅复制,需要使用 copy 模块中的 deepcopy() 函数实现深复制。

可在 Python Tutor 中以可视化的方式查看 http://pythontutor.com/.

5年前 评论
Jason990420 (楼主) 5年前