Функция 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. Он изменен, а не неизменен.
Заранее спасибо.
- присвоение значения в python dict (копия с ссылкой)
- Python deepcopy .. вид
- Списки разыменования внутри списка в Python
- вернуть ссылку на подматрицу из функции в numpy
- Чтение данных с определенного адреса / ссылки на объект
Проблема в том, что вы на самом деле копируете определение класса, а не экземпляр класса.
Другая проблема кода заключается в том, что атрибуты 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())
- почему изменение размера изображения в Pillow-python удаляет Image.format?
- Почему numpy.dot ведет себя таким образом?
- python deepcopy и мелкая копия и ссылка на проход
- Список пересылает ссылку на путаницу в Python
- Можете ли вы прояснить эту проблему ссылок в Python?
- Справочная проблема Python
- Python: эмулировать pass-by-reference в C-стиле для переменных
- Когда переменные относятся к одному и тому же объекту, как это называется, и почему у python есть эта функция?
- Что такое эквивалент Go эквивалент оператора «is» Python?
- Создание интерактивных анимаций физических систем в Python
- Список ссылок на объекты в python