From an aesthetic point of view it arguably looks more balanced. The comma also marks the end of the item similarly to what semicolons do for statements.
On a practical note. If you add an item to the list you won’t have to go back and add a comma to the line before. This makes commit diffs less noisy.
I agree with having commas at the end of every line. That has been supported in most constructs for a while now, and I find it much more convenient than having a first compiler-run just to fix the commas after some larger changes.
If the items are on separate lines, put a comma after each of them. This makes it easier to move things around, and doesn’t yield a ,] construct.
If the items are on a single line, don’t put the last comma, it’s in line with math notation (you don’t see S = {1, 2, 3,} in math, and moving things around always modifies the line anyway, no need to keep the extra comma.
EDIT (from below): The only exception to this is the one-element tuple, where the comma is required.