Массив сам очищает предыдущие значения, после чего заполняет их значением текущей итерации

Рейтинг: -1Ответов: 1Опубликовано: 04.08.2023
import re
import os

def Factorial(n):
    factorial = 1
    if n == 0:
        factorial = 1
    else:
        for i in range(n):
            factorial *= n+1
    return factorial


mathSign = ["+", "-", "*", "/", "!", "^", "%", "(", ")"]


mathSignOperation = {
    "+": lambda x, y: x + y,
    "-": lambda x, y: x - y,
    "*": lambda x, y: x * y,
    "/": lambda x, y: x / y

}

while True:

    index = []
    numberList = []
    mathSignList = []
    number = ""
    mathSignAdd = []
    numberAdd = []

    maxBrackets = 0
    bracketsCount = 0
    bracketsList = []
    bracketsmathSignList = []
    bracketsListPoint = {}  

    while True:
        check = ""
        mathFunction = input("\nЧтобы завершить программу введите End.\nВведите пример: ").replace(" ","")
        if mathFunction.lower() == "end":
            os.abort()
        check = re.search(r'[a-zA-Zа-яА-ЯёЁ@"#$&?><|]', mathFunction)
        if check != None:
            print("Пример введен не корректно\n")
        else:
            break


    for i in range(len(mathFunction)):
        if mathFunction[i] in mathSign:
            if mathFunction[i] != "(":
                if number != "":
                    numberList.append(number)
                number = ""
                mathSignList.append(mathFunction[i])
            if mathFunction[i] == "(":
                numberList.append("brackets"+str(bracketsCount))
                mathSignList.append(mathFunction[i])
                bracketsListPoint["brackets"+str(bracketsCount)] = [len(mathSignList)-1, None]
                bracketsCount += 1
                maxBrackets = bracketsCount
            if mathFunction[i] == ")":
                while bracketsCount >= 0:
                    bracketsCount -= 1
                    if bracketsCount < 0:
                        print("Присутствуют лишнии знаки закрытой скобки")
                        os.abort()
                    if bracketsListPoint["brackets"+str(bracketsCount)][1] == None:
                        numberList.append("brackets-"+str(bracketsCount))
                        bracketsListPoint["brackets"+str(bracketsCount)][1] = len(mathSignList)-1
                        break
                bracketsCount = maxBrackets   
        else:

            number += mathFunction[i]
    if number != "":
        numberList.append(number)

    for i in range(maxBrackets-1, -1, -1):
        numberAdd.clear()
        mathSignAdd.clear()
        j = numberList.index("brackets"+str(i)) + 1
        while "brackets-"+str(i) in numberList:
            numberAdd.append(numberList.pop(j))
        j = bracketsListPoint["brackets"+str(i)][0]
        while mathSignList[j] != ")":
            mathSignAdd.append(mathSignList.pop(j))
        mathSignAdd.pop(0)
        mathSignList.pop(j)
        numberAdd.pop()
        bracketsList.append(numberAdd)
        bracketsmathSignList.append(mathSignAdd)
    bracketsList.reverse()
    bracketsmathSignList.reverse()
    bracketsList.append(numberList)
    bracketsmathSignList.append(mathSignList)

    print(numberList)
    print(mathSignList)
    print(bracketsList)
    print(bracketsmathSignList)
    print(bracketsListPoint)

Данный код принимает в себя уравнение, например 2*(5+7). Возникла проблема массивы bracketsList и bracketsmathSignList должны разделять уравнение по частям, относительно найденных скобок. Но при каждой новой итерации цикла for i in range(maxBrackets-1, -1, -1):, все предыдущие значения списка очищаются, а потом заполняются значением текущей итерации.

Ответы

▲ 2Принят

Всё, увидел наконец. Вы добавляете в bracketsList.append(numberAdd) объект-список numberAdd целиком, и при очистке numberAdd внутренний список очищается, это ведь тот же самый объект.

Если вам нужен вложенный список, то он должен быть независим от источника, используйте добавление копии (аналогично и с bracketsmathSignList)

 bracketsList.append(numberAdd[:])

или

 bracketsList.append(numberAdd.copy())