Yeah. I noticed this later.
Example:
```
In [0]: self = Sum(k*f(x)**n, (k, 1, 10))
In [1]: new = Sum(k*x**n, (n,1,2), (k,1,2))
In [2]: old=f(n)
In [3]: self._eval_subs(old,new)

Out[0]: #for free_symbols
  10         
 ___         
 ╲           
  ╲      n   
  ╱   k⋅f (x)
 ╱           
 ‾‾‾         
k = 1

Out[1]: #for atoms(Symbol)
ValueError: substitution can not create dummy dependencies
```

This code block tries to figure out whether the common terms inside the new(symbols) and self(variables) are a part of common terms inside old(args) and self (variables). When ```free_symbols``` is used, the bound(dummy) variables which are common to self but not in old will be masked and through this block. But it finds nowhere through ```atoms(Symbol)```.