Я разрабатываю калькулятор с использованием Python. Проблема, с которой я столкнулся, заключается в том, что когда я пытаюсь переключить знак последнего числа, введенного пользователем с помощью кнопки ⁺∕₋, все аналогичные числа в тексте также переключаются. Я считаю, что причиной этого является оптимизация памяти Python, из-за которой похожие строки сохраняются в памяти только один раз, а их адреса используются в списке несколько раз.
код:
Я разрабатываю калькулятор с использованием Python. Проблема, с которой я столкнулся, заключается в том, что когда я пытаюсь переключить знак последнего числа, введенного пользователем с помощью кнопки ⁺∕₋, все аналогичные числа в тексте также переключаются. Я считаю, что причиной этого является оптимизация памяти Python, из-за которой похожие строки сохраняются в памяти только один раз, а их адреса используются в списке несколько раз. код: [code]import re, math from decimal import Decimal from fractions import Fraction from customtkinter import *
...
def on_button_click(self, char:str):
if char == "✔": # self.buttons_dict[char].configure(text="") ... elif char == 'C': self.entry.delete(0, END) elif char == 'CE': self.entry.delete(0, END) elif char == 'Del': current_text = self.entry.get() self.entry.delete(0, END) self.entry.insert(END, current_text[:-1]) elif char == '⁺∕₋': current_text = self.entry.get() current_text_list = [(item+' ')[:-1] for item in re.split("[÷×+–]",current_text)] for i in current_text_list: print(id(i)) if current_text: print(current_text_list) if current_text_list[-1][0] == '(': self.entry.delete(0, END) if len(current_text_list) > 1: last_txt = current_text_list[-1] current_text_list[-1] = current_text_list[-1][2:].replace(")", "") self.entry.insert(END, current_text.replace(last_txt,current_text_list[-1])) else: self.entry.insert(END, current_text.replace(current_text_list[-1], current_text_list[-1].replace("-", ""))) else: self.entry.delete(0, END) if len(current_text_list) > 1: self.entry.insert(END, current_text.replace(current_text_list[-1], f"(-{current_text_list[-1]})")) else: self.entry.insert(END, current_text.replace(current_text_list[-1], f"-{current_text_list[-1]}"))
elif char == '=': self.buttons_dict[char].configure(text="✔") try: expression = self.entry.get().replace('x', '*') result = eval(expression.replace('×', '*').replace("÷", '/')) if isinstance(result, float): result_decimal = Decimal(result).quantize(Decimal('0.01')) if math.isclose(result, float(Fraction(result_decimal))): display_result = result_decimal else: display_result = f"{result_decimal}..." else: display_result = result self.entry.delete(0, END) self.entry.insert(END, str(display_result)) except Exception as e: self.entry.delete(0, END) self.entry.insert(END, 'Error') else: current_text = self.entry.get() self.entry.delete(0, END) self.entry.insert(END, current_text + char) [/code] Решения, которые я пробовал, но не сработало: [code]current_text_list = [(item+'.')[:-1] for item in re.split("[÷×+–]", current_text)][/code] [code]current_text_list = re.split("[÷×+–]", current_text) current_text_list[-1] = (current_text_list[-1]+'.')[:-1] [/code] [code]new_current_text_list = [str(i) for i in current_text_list][/code] [code]copied_list = copy.deepcopy(current_text_list)[/code] Результат всего теста: Ввод: 2 × 2 После нажатия кнопки ⁺∕₋: Результат: (-2) × (-2)