The problem is the `Attributes` alloted to `Downvalues` are `HoldAll` and `Protected`. This is in addition to the `HoldAll` attribute of `Table`. Hence, in the first case, first, `Downvalues` returns an empty list, which Table takes in to create its own list. So, you get a list of two empty lists. In the second case, you don't have such an intermediary function which has a `HoldAll` attribute to begin with. **Edit 1**: Table[DownValues[i], {i, {test1, test2}}] // Trace This clearly shows, that `Downlnvalues[i]` never gets substituted by `Downvalues[test1]` or `Downvalues[test2]`. Hope this clears things out