简体   繁体   中英

Error appending to objects' list attributes in python

I'm trying to make a model where nodes connect to one and other using OOP. I'd like each node to store the names of its inputs and connections within lists and have these lists as attributes. The code seems to function perfectly outside of the "connect" function.

It creates desired Connection object, but it creates erroneous attributes for the destination node and origin nodes. The desired attributes are:

A.inputs = [],

A.outputs = [B]

B.inputs = [A]

B.outputs = [0]

But instead of that I get:

A.inputs = [A]

A.outputs = [B}

B.inputs = [A]

B.outputs = [B}

CONNECTIONS = []
NODES = []

class Zone: 
    def __init__(self, height, width):
        self.height = height
        self.width = width 

class Node:
    def __init__(self, name, initial_activation, activation_function = "linear", inputs  = [], outputs = [], location = (0,0)):
        global NODES
        self.name = name
        self.activation = initial_activation
        self.activation_function = activation_function
        self.inputs = inputs
        self.outputs = outputs
        self.location = location
        NODES.append(self)
    
    def __repr__(self):
        return(f"Node {self.name}")

class Connection: 
    def __init__(self, origin, destination):
        self.origin = origin.name
        self.destination = destination.name

    def __repr__(self):
        return(f"Connection from {self.origin} to {self.destination}")

def connect(origin, destination):
    new_connection = Connection(origin, destination)
    origin.outputs.append(destination.name) 
    destination.inputs.append(origin.name)
    global CONNECTIONS
    CONNECTIONS.append(new_connection)


A = Node("A",0)
B = Node("B", 0, location = (100,100))

A.__dict__  #  verify it is correct before hand
B.__dict__
test_connection = Connection(A,B)
test_connection.__dict__
connect(A,B)  #  create connection

A.__dict__  #  show erroneous result
B.__dict__
CONNECTIONS
CONNECTIONS[0].__dict__  #  verify connection object is correct

I have tried to debug using print statements, but to no avail. I believe the problem is found within lines 33 and 34 but I cannot see an error in those lines.

I see that Node class has mutable default arguments values for variables inputs and outputs.

In code, you don't pass values for this argument so A.input refers to same list as B.input.

print(id(A.inputs) == id(B.inputs))

will print True.

You need to get rid off mutable default argument, fe doing this:

class Node:
    def __init__(self, name, initial_activation, activation_function="linear",
                 inputs=None, outputs=None, location=(0, 0)):
        # Some code
        self.inputs = inputs or []
        self.outputs = outputs or []

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM