Its probably something simple, but i cant see why boundary_tests is mutating here.
# initalise boundary tests used in other functions
def initialise_boundary_tests(self):
    self.boundary_tests = \
        [self.is_lowest(),
         self.is_highest(),
         self.is_leftmost(),
         self.is_rightmost()]
    self.b0 = self.boundary_tests[0]
    self.b1 = self.boundary_tests[1]
    self.b2 = self.boundary_tests[2]
    self.b3 = self.boundary_tests[3]
    self.set_inverse_bounds()
    if self.debugging:
        print("boundary test: " + str(self.boundary_tests))
        print("inverse boundary test: " + str(self.inverse_boundary_tests))
#initialise inverse results as results
def set_inverse_bounds(self):
    if self.debugging:
        print("setting inverse boundary tests")
        print("boundary test: " + str(self.boundary_tests))
    # self.inverse_boundary_tests = self.boundary_tests
    temp = self.boundary_tests
    self.inverse_boundary_tests = temp
    print("boundary test: " + str(self.boundary_tests))
    print("inverse boundary test: " + str(self.inverse_boundary_tests))
    for index in range(len(self.inverse_boundary_tests)):
        print("index" + str(index))
        if self.inverse_boundary_tests[index] != 0:
            print("before change: "+str(self.inverse_boundary_tests[index]))
            self.inverse_boundary_tests[index] = self.inverse_boundary_tests[index] * -1
            print(self.inverse_boundary_tests[index])
    self.i0 = self.inverse_boundary_tests[0]
    self.i1 = self.inverse_boundary_tests[1]
    self.i2 = self.inverse_boundary_tests[2]
    self.i3 = self.inverse_boundary_tests[3]
Output:
setting inverse boundary tests
boundary test: [1, -1, 0, 1]
boundary test: [1, -1, 0, 1]
inverse boundary test: [1, -1, 0, 1]
index0
before change: 1
-1
index1
before change: -1
1
index2
index3
before change: 1
-1
boundary test: [-1, 1, 0, -1]
inverse boundary test: [-1, 1, 0, -1]
 
    