#python #copy #mutable
#python #Копировать #изменяемый
Вопрос:
Я пытаюсь выполнить упражнение, и как часть этого я создаю 7 объектов узла.
import copy
class Node (object):
nodedesignation = 0 # this is a static class variable.
def __init__(self, value):
self.value = value
Node.nodedesignation =1
self.designation = copy.deepcopy(Node.nodedesignation)
#self.designation = Node.nodedesignation - original code. same result
print (self.designation)
Я пытаюсь, чтобы каждый узел имел индивидуальное обозначение (self.обозначение), чтобы первый созданный узел имел значение nodedesignation = 1, а 7-й созданный узел будет иметь значение nodedesignation = 7.
ПРОБЛЕМА Это отлично работает при инициализации каждого узла, однако, когда статическая переменная Node.nodedesignation увеличивается на 1, каждое из обозначений узла также увеличивается. (self.nodedesignation = 7 для каждого узла после инициализации всех узлов)
Я думал, что copy.deepcopy сделает self.обозначение независимым от изменений в Node.nodedesignation однако я все равно получаю тот же результат. Как я могу сделать эти переменные независимыми друг от друга?
Спасибо.
Ответ №1:
nodedesignation
является атрибутом класса, поэтому каждый экземпляр имеет одинаковый, но вы создаете атрибут designation
для каждого экземпляра, поэтому этот атрибут индивидуален.
Кстати. copy не требуется, потому int
что s являются неизменяемыми.
class Node (object):
nodedesignation = 0 # this is a class attribute.
def __init__(self, value):
self.value = value
self.right = None
self.left = None
Node.nodedesignation = 1 # increment the class attribute
self.designation = Node.nodedesignation # use it's value as instance attribute
print(self.designation)
Создавая разные Node
s, каждый имеет свой собственный designation
:
node1 = Node(1)
node2 = Node(2)
node3 = Node(3)
print(node1.designation)
# 1
print(node2.designation)
# 2
print(node3.designation)
# 3
Комментарии:
1. Привет, Дэниел, спасибо за ответ. Ваше решение заключается в том, как я изначально реализовал свой код, но обнаружил, что у этого была та же проблема. Я согласен, что я ожидаю, что это правильно присвоит каждому узлу уникальное самоназначение. однако, как только все семь узлов будут созданы, самоназначение каждого узла равно 7. Я думаю, что есть еще один фактор. Это наводит меня на мысль, что self.namespace по-прежнему ссылается на значение Node.nodedesignation, что нежелательно.
2. @Didgeridude: смотрите мою правку. Все работает так, как ожидалось.