Python—跨类的多个实例创建类中列表字段的单个副本
我有以下课程。我创建的类的每个实例都具有列表字段的相同副本Python—跨类的多个实例创建类中列表字段的单个副本,python,python-3.x,Python,Python 3.x,我有以下课程。我创建的类的每个实例都具有列表字段的相同副本 class Vertex: label = None data = None connected_vertices_ids = [] def __init__(self, data): self.data = data self.label = randint(1, 100) def __init__(self, vertex_id, data):
class Vertex:
label = None
data = None
connected_vertices_ids = []
def __init__(self, data):
self.data = data
self.label = randint(1, 100)
def __init__(self, vertex_id, data):
self.data = data
self.label = vertex_id
def print_vertex(self):
print(self.label, self.connected_vertices_ids)
用法
结果
140582021542688 140582025347656140582021542744 140582025347656
140582021542800 140582025347656
140582021542856 140582025347656
140582021542912 140582025347656
140582021542968 140582025347656
我的错。我是python新手,不熟悉内存模型。我认为在构造函数外部初始化的字段的行为是静态的。当我将类代码更改为以下代码时,问题就解决了
class Vertex:
label = None
data = None
connected_vertices_ids = None
def __init__(self, data):
self.data = data
self.label = randint(1, 100)
self.connected_vertices_ids = []
def __init__(self, vertex_id, data):
self.data = data
self.label = vertex_id
self.connected_vertices_ids = []
def print_vertex(self):
print(self.label, self.connected_vertices_ids)
如果有人能更正式地回答这个问题,我将不胜感激@depperm:它是对象的标识符,或多或少是存储对象的内存地址。您有两个构造函数吗?这是允许的吗?你是对的,python中不允许有多个构造函数。不知道为什么当时没有爆炸。然而,这并没有引起我发布的问题。我贴出了答案。如果您有任何需要添加的内容,请确保您的代码在复制到帖子中时具有正确的缩进。您的推理也是正确的
connected_Vertex_id
被声明并分配为Vertex
类的属性,因此它本质上是所有实例使用的单个静态属性。
class Vertex:
label = None
data = None
connected_vertices_ids = None
def __init__(self, data):
self.data = data
self.label = randint(1, 100)
self.connected_vertices_ids = []
def __init__(self, vertex_id, data):
self.data = data
self.label = vertex_id
self.connected_vertices_ids = []
def print_vertex(self):
print(self.label, self.connected_vertices_ids)