Notes on the Demo Files File empty-nodes.gh demonstrates that Grasshopper doesn't allow empty lists; it treats them as an error. This is unlike Python, where [] is a perfectly valid data structure. Because empty lists are an error in Grasshopper, it's impossible to construct the equivalent of Python's [[]], since this is a list containing an empty list. You can see in the Grasshopper window that trying to run an empty container through a Graft component just gives an error, not a tree containing an empty list. The tree viewer displays a node that contains only a data collection as a red dot. The data collection itself is an orange circle. If a node contains branches, it is displayed as a green circle, whether or not it has a data collection. Further down in empty-nodes.gh we experiment with how Grasshopper merges data from two trees when they both feed into a single container. It does this by combining the collections at corresponding leaf nodes. By feeding trees with different branch patterns into the same container, it is possible to produce an irregularly shaped result, where some nodes have both a collection of data and also a set of outgoing branches. The data viewer (tree drawer) will not show you this, but you can see it if you create a Panel to view the contents of the tree. ================ The file data-matching.gh looks at the problem of producing the Cartesian product of two sets, e.g., {Foo, Bar} X {-10, -20, -30, -40} should give eight items, starting with Foo-10, Bar-10, Foo-20, etc. You need a Cross Reference component to produce the correct number of copies of the two lists, with elements repeated in the correct order for the Cartesian product to work. But you also need the two trees to have the right shape so that when you feed them together as input to the Join component, the right thing happens. This requires Grafting both the A and B outputs of Cross Reference so that each element is its own branch. Then when the two trees are merged at the input to Join, we get eight branches with two elements each, and Join will operate on each branch independently. The bottom part of data-matching.gh looks at what happens if you only Graft one of the two trees. In this case the tree shapes don't match, so the merger doesn't group the data correctly and the result of Join is a misshapen tree.