Проблема с переключением знака последнего введенного числа в калькуляторе с использованием ⁺∕₋ в PythonPython

Программы на Python
Ответить
Anonymous
 Проблема с переключением знака последнего введенного числа в калькуляторе с использованием ⁺∕₋ в Python

Сообщение Anonymous »

Я разрабатываю калькулятор с использованием Python. Проблема, с которой я столкнулся, заключается в том, что когда я пытаюсь переключить знак последнего числа, введенного пользователем с помощью кнопки ⁺∕₋, все аналогичные числа в тексте также переключаются. Я считаю, что причиной этого является оптимизация памяти Python, из-за которой похожие строки сохраняются в памяти только один раз, а их адреса используются в списке несколько раз.
код:

Код: Выделить всё

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)
Решения, которые я пробовал, но не сработало:

Код: Выделить всё

current_text_list = [(item+'.')[:-1] for item in re.split("[÷×+–]", current_text)]

Код: Выделить всё

current_text_list = re.split("[÷×+–]", current_text)
current_text_list[-1] = (current_text_list[-1]+'.')[:-1]

Код: Выделить всё

new_current_text_list = [str(i) for i in current_text_list]

Код: Выделить всё

copied_list = copy.deepcopy(current_text_list)
Результат всего теста:
Ввод: 2 × 2
После нажатия кнопки ⁺∕₋:
Результат: (-2) × (-2)

Подробнее здесь: https://stackoverflow.com/questions/791 ... 82%8b-in-p
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»