The reason for the apparently redundant extra mention of the variable x when writing x for x is that the first x does not need to be x. It just happens to be in the examples you give. Here are a few more examples which should clarify the difference between the first and second x in your question:
ones = [1 for x in range(10)]
This simply gives a list of 10 ones, the same as [1] * 10.
squares = [x*x for x in range(10)]
This gives x squared for each x in the specified range.
In your example, the second x is the variable used by the for loop, and the first x is simply an expression, which happens in your case to be just x. The expression can be whatever you like, and does not need to be in terms of x.
results = [expression for x in range(10)]
expression can include anything you like - a string, a calculation, a function - whatever you choose. If the expression happens to be just x then it looks unusual if you are not used to it, but it's the same as the following:
results = []
for x in range(10):
results.append(expression)