Python: — Использование Copy для получения значения статической переменной внутри класса

#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: смотрите мою правку. Все работает так, как ожидалось.