The for loop produces the range() object just once, but in the loop you are removing elements from the list, making it shorter.
This leads to another problem: you'll be skipping elements. If you remove element 1, all elements after it shift up one position; element 2 is now element 1, etc. But your loop never takes this into account, so it'll skip the element now moved from position 2 to 1.
This is compounded by the fact you only use the preceding element to test set membership against; the skipped element is suddenly the value against which another value is being tested. They could well be different but that doesn't mean earlier elements are not going to be equal.
Further issues: You used an unnamed index() function in your code which means we cannot verify what it does. If it works like the list.index() method you'd be removing the first occurrence of the value from the list object. This could work, but you already had elem as an index into the list, why search for it again?
The next entry on it's own line is just a reference to the next() function, without ever calling it. As such, it is a no-op. You probably meant to use the continue statement here instead.
A simpler version would have been:
for i in range(len(x), -1, -1):
if x[i] in x[:i]:
del x
e.g. starting from the end of the list, if the current element is present in the list before this position, remove it. However, using a set would be far more efficient still.
nextdoesn't do anything; it is a no-op as it just references the built-in function.index()function?