Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python类:复制对象(不导入副本的深度复制)_Python_Python 3.x_Class - Fatal编程技术网

Python类:复制对象(不导入副本的深度复制)

Python类:复制对象(不导入副本的深度复制),python,python-3.x,class,Python,Python 3.x,Class,我想构建一个方法,创建具有不同内存地址的对象的完全独立副本(深度副本)。这样旧对象的值就不会受到新对象的值更改的影响 我不想使用“importcopy”,而是想通过在类中定义一个新方法来手动完成 比如说,我一直在构建一个名为“student”的新类,并创建了一个对象“eden” class student: def __init__(self, name, year, number): self.name = name self.year = year

我想构建一个方法,创建具有不同内存地址的对象的完全独立副本(深度副本)。这样旧对象的值就不会受到新对象的值更改的影响

我不想使用“importcopy”,而是想通过在类中定义一个新方法来手动完成

比如说,我一直在构建一个名为“student”的新类,并创建了一个对象“eden”

class student:

    def __init__(self, name, year, number):
        self.name = name
        self.year = year
        self.number = number
        self.grades = []

    def new_num(self, number):
        self.number = number

    def update_grades(self, grades):
        self.grades.append(grades)

    def create_copy(self): ### this is what I want to create
        copy = student(self.name, self.year, self.number)
        return copy

eden = student('eden', 2, 12345)

#update new grades of eden
eden.update_grades(100)
eden.update_grades(90)
eden.update_grades(80)
eden.update_grades(95)

new_eden = eden.create_copy() #created a new object, new_eden
new_eden.new_num(54321) #change a value

print(eden is new_eden) #False

print(eden.grades) #[100, 90, 80, 95]
print(new_eden.grades) #[]


虽然我似乎设法创建了一个具有不同id的对象的副本,但它显示一个实例变量self.grade尚未复制到新对象。我想知道如何复制与旧数据相同的所有数据。(在这种情况下,我错过了self.grades)提前谢谢:)

copy.grades=list(self.grades)
create\u copy@khelwood:Or
copy.grades=self.grades.copy()
copy.grades=self.grades[:],只是为了完整起见。在所有情况下,这只是一个肤浅的副本,但如果
grades
存储不可变的类型,如
int
s或
float
s,那就好了。非常感谢。现在可以了!这回答了你的问题吗?