Почему замена переменной в выражении переменной с тем же именем, но с другим именем символа не работает

Как заменить переменную в функции новым определением начальной переменной?

import sympy as sy
g, a, x = sy.symbols("g a x")
g = 5*a*x

Ввод g в интерпретаторе в этой точке печатает:
5 * а * х.

Теперь я хотел бы заменить напечатанное с альфа. Почему следующее не работает?

a = sy.symbols("alpha")
g = g.subs(a,a)

Я хорошо знаю, что я мог бы использовать следующее:

import sympy as sy
g, a, x = sy.symbols("g a x")
g = 5*a*x
alpha = sy.symbols("alpha")
g = g.subs(a,alpha)

Но я хотел бы понять, почему прежний подход не работает. Вообще меня интересует, как связаны назначенное имя a= и строка в символах ("a"). Должны ли они быть одинаковыми, чтобы sympy работал правильно?

1 ответ

Решение

g = g.subs(a, a) никогда ничего не может сделать, так как он заменяет вещь собой.

Заменить a с чем-то еще

g.subs(a, sy.symbols('alpha'))

должен быть использован. Соответствующая тема в документах SymPy - Назначение не создает отношения. Более простой пример:

a = sy.symbols('a')
b = a + 3      # b is now a+3 
a = 5          # b is still a+3 and it will not become 8

В конце этого кода переменная Python a не имеет отношения к символу SymPy с именем "a". Переменная 5; символ все еще Symbol("a") и так будет всегда, так как выражения SymPy неизменны. Вместо a = 5 нужно было сделать b.subs(a, 5) выполнить замену.

Меня интересует, как связанное имя a= и строка в символах ("a") связаны между собой.

Они не связаны вообще. Удобно использовать переменную Python a указывать на символ с именем "а", это единственная причина, по которой люди делают это. К сожалению, модель затем вводит их в заблуждение, что если они a = что-то новое, что будет влиять на Symbol("a") -- Я не буду. Единственный эффект - переменная Python теперь указывает на что-то еще; выражения, содержащие Symbol("a") не затронуты.

Другие вопросы по тегам