And if you have any doubt about whether clashing symbols are being used, 
you can use `disambiguate`:

```
>>> eq=var('x')*var('x',positive=1)
>>> eq
x*x
>>> from sympy.core.symbol import disambiguate
>>> disambiguate(eq)
(x*x_1,)
```
/c
On Monday, April 12, 2021 at 5:27:42 PM UTC-5 asme...@gmail.com wrote:

> The best way to avoid this issue is to be hygienic in how you define
> Symbols. My recommended best practices would be
>
> - Always define symbols at the top of your file/notebook, or top of
> the function if your use of sympy is restricted to a single function.
> - Assign symbols to variables. Don't inline Symbol('x') in an
> expression, but rather define x = symbols('x') first. Note that you
> can define multiple symbols with the same assumptions on a single line
> with the symbols() function.
> - Always keep the same assumptions for any given symbol name. So for
> instance if t = Symbol('t', positive=True) in one place, you should
> always make it positive. Which variables will have which assumptions
> will depend on your application.
> - Name your symbol variables the same as your symbols, or as something
> reasonably close if the symbol name isn't a valid variable name.
> - Never overwrite a variable name assigned to a symbol. For example,
> don't do this
>
> a = Symbol('a')
> ...
> <some stuff>
> ...
> a = 1.1
>
> This makes it impossible to access the symbol 'a' without recreating
> it again. Use a different variable name, or consider storing values in
> a dictionary, like {a: 1.1} (note that you can pass dictionaries to
> subs()).
>
> There's also a confusion I've noticed with this, where people will do
> something like this
>
> a, x = symbols('a x', real=True)
> a = 1.1
> expr = a*x**2
>
> The a = symbols(...) here does nothing, because it is immediately
> overwritten by a = 1.1. The fact that this sets 'a' as real is
> irrelevant. More correct could would be
>
> x = symbols('x', real=True)
> a = 1.1
> expr = a*x**2
>
> Or if you wish for 'a' to be symbolic for part of the calculation then
> later replaced with a numeric value,
>
> a, x = symbols('a x', real=True)
> expr = a*x**2
> <symbolic calculations>
> evaluated_expr = expr.subs(a, 1.1)
>
> As Oscar noted, SymPy doesn't have a "database" or anything like that.
> Symbols are defined as independent objects. On the line 'a = 1.1', the
> symbol 'a' is deleted and the variable 'a' is set to 1.1. Creating a
> symbol with certain assumptions has no effect on any other object.
> SymPy functions are generally speaking, side effect free.
>
> Remember that SymPy objects, including symbols, do not and cannot know
> anything about the Python variable names they are assigned to. They
> are just objects, and Python variables are names that point to them.
> Read https://docs.sympy.org/latest/tutorial/gotchas.html and
> https://nedbatchelder.com/text/names.html if you are confused about
> this.
>
> Aaron Meurer
>
> On Sun, Apr 11, 2021 at 9:26 AM David Bailey <da...@dbailey.co.uk> wrote:
> >
> > Dear group,
> >
> > Recently Bruce Allen discussed a problem that he had after pickling a
> > list. However, I think he revealed a deeper problem that is nothing to
> > do with pickling.
> >
> > w=sin(Symbol("x", positive=True))*cos(Symbol("x"))
> >
> > sin(x)*cos(x)
> >
> > test=Integral(w,,x)
> >
> > Integral(sin(x)*cos(x), x)
> >
> > test.doit()
> >
> > sin(x)*sin(x)
> >
> > OK, that was a bit contrived, but it does show how worryingly easy it is
> > to generate multiple symbols with the same name in the same Python 
> context.
> >
> > Clearly when processing the first statement, SymPy inserts x into its
> > data base as a symbol with an assumption. After that it creates a
> > distinct symbol x without that assumption!
> >
> > I would have thought it would be kinder to cause an exception in that
> > case to prevent the ensuing confusion.
> >
> > David
> >
> > --
> > You received this message because you are subscribed to the Google 
> Groups "sympy" group.
> > To unsubscribe from this group and stop receiving emails from it, send 
> an email to sympy+un...@googlegroups.com.
> > To view this discussion on the web visit 
> https://groups.google.com/d/msgid/sympy/e008170c-fc64-8101-3f03-9f988429c848%40dbailey.co.uk
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sympy+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sympy/22016362-62e5-4964-aeae-81aac1310dc9n%40googlegroups.com.

Reply via email to