二维的数组复制

我在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/.

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

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

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

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

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!