Hi Brian, when you fetch a Chem.Atom object from a Chem.Mol a Python object is created on-the-fly that wraps the underlying C++ object. Every time you do this, a new Python object is created. This does not apply only to GetNeighbors(); please see an example below:
In [1]: from rdkit import Chem In [2]: mol = Chem.MolFromSmiles("C") In [3]: a0_1 = mol.GetAtomWithIdx(0) In [4]: a0_2 = mol.GetAtomWithIdx(0) In [5]: a0_1 == a0_2 Out[5]: False In [6]: a0_1 Out[6]: <rdkit.Chem.rdchem.Atom at 0x7fd2de00e5d0> In [7]: a0_2 Out[7]: <rdkit.Chem.rdchem.Atom at 0x7fd2de0195d0> In [8]: a0_1.GetIdx() == a0_2.GetIdx() Out[8]: True In short, you cannot rely on comparing Chem.Atom object identity, but you can certainly rely on their index. Cheers, p. On Fri, Jan 8, 2021 at 5:00 AM Brian Peterson <brian.peter...@molsight.com> wrote: > Hello all. When traversing a molecule's atoms with atom.GetNeighbors(), > the object returned for an atom is not necessarily the same object > returned when the atom is indexed directly from the molecule. This means > one can't directly compare two atoms as objects found while traversing a > molecule via neighbors to see if they are the same atom. It seems a new > object is created for the atom returned by .GetNeighbors(). Is this > expected behavior and what is the reason for this? I've found that the > comparison can be done by using atom.GetIdx(), but wanted to use the > objects themselves for various reasons. Thanks. > > Example: > ------------------------- > > from rdkit import Chem > > m = Chem.MolFromSmiles('C(F)(Cl)(Br)(I)') > atoms = [myatom for myatom in m.GetAtoms()] > for myatom in atoms: > print(myatom.GetIdx(),myatom.GetSymbol(),myatom) > > print("The neighbors of {} are:".format(atoms[1].GetSymbol())) > for newatom in atoms[1].GetNeighbors(): > print(newatom.GetIdx(),newatom.GetSymbol(),newatom) > > print("C0 == C0 ?") > print(atoms[0] == newatom) > > Output: > ---------------------------- > 0 C <rdkit.Chem.rdchem.Atom object at 0x7f0d429ca760> > 1 F <rdkit.Chem.rdchem.Atom object at 0x7f0d429ca850> > 2 Cl <rdkit.Chem.rdchem.Atom object at 0x7f0d429ca940> > 3 Br <rdkit.Chem.rdchem.Atom object at 0x7f0d429caa30> > 4 I <rdkit.Chem.rdchem.Atom object at 0x7f0d429cab20> > The neighbors of F are: > 0 C <rdkit.Chem.rdchem.Atom object at 0x7f0d429cac10> > C0 == C0 ? > False > > > > > > > _______________________________________________ > Rdkit-discuss mailing list > Rdkit-discuss@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/rdkit-discuss >
_______________________________________________ Rdkit-discuss mailing list Rdkit-discuss@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/rdkit-discuss