Функция Python copy.deepcopy () не работает должным образом

Я играю с функцией deepcopy и функцией копирования, и я получаю одну и ту же проблему с обоими из них. Это похоже на то, что копия была ссылкой (или указателем) вместо правильной копии. Я работаю с записями данных (классами) в Python, возможно, это может быть так. Я покажу вам пример:

>>> import copy >>> class player1: ... age = 23 ... score = 1 >>> class player2: ... age = 14 ... score = 2 >>> player3 = copy.deepcopy(player1) 

Я печатаю параметры.

 >>> print player1.age, player1.score 23 1 >>> print player2.age, player2.score 14 2 >>> print player3.age, player3.score 23 1 

Теперь я увеличиваю параметр оценки в записи данных player1.

 >>> player1.score += 3 

И снова напечатаю результаты.

 >>> print player1.age, player1.score 23 4 >>> print player2.age, player2.score 14 2 >>> print player3.age, player3.score 23 4 

ПОЧЕМУ ИМЕЕТ ИГРОК 3 ИЗМЕНЕН? Я просто увеличил параметр в player1, а не на игроке3. Он изменен, а не неизменен.

Заранее спасибо.

Проблема в том, что вы на самом деле копируете определение класса, а не экземпляр класса.

Другая проблема кода заключается в том, что атрибуты age и score являются частью класса и будут разделяться между всеми экземплярами этого класса. Вероятно, это не то, что вы намеревались.

Что вы, вероятно, хотите сделать, это:

 import copy class Player: def __init__(self, age, score): self.age = age self.score = score player1 = Player(23, 1) player2 = Player(14, 2) player3 = copy.deepcopy(player1) player1.age += 1 print "player1.age", player1.age print "player3.age", player3.age 

Это дает вам то, что вы ожидаете:

 player1.age 24 player3.age 23 

Из документации (акцент мой):

Эта версия не копирует такие типы, как модуль, класс , функция, метод, трассировка стека, стек стека, ни файл, ни сокет, ни окно, ни массив, ни какие-либо подобные типы.

Вы пытаетесь скопировать классы, и так:

 >>> player3 = copy.deepcopy(player1) >>> player1 is player3 True 

но

 >>> p1 = player1() >>> p2 = player2() >>> p3 = copy.deepcopy(p1) >>> p1 is p3 False 

Это работает так, как было разработано.

В вашем примере кода вы копируете определения классов, а не экземпляры объектов. На странице руководства модуля copy :

 It does “copy” functions and classes (shallow and deeply), by returning the original object unchanged 

Следовательно:

 player3 = copy.deepcopy(player1) 

такой же как:

 player3 = player1 

Однако, если вы скопировали экземпляры классов, вы получите ожидаемый результат:

 player3 = copy.deepcopy(player1())