In Python everything is an object and variables contain references to objects. When you make a function call it makes copies of the references. Some people including Guido van Rossum call this "Call by object reference". Important note from Wikipedia:
a function cannot change the value a variable references in its calling function.
The code as you posted it prints nothing at all. I think you mean to add this extra line to your program:
x()
This then results in the output: None. This is not surprising because you are printing the value of self.y but the only value you ever assign to self.y is None.
In Python, strings are immutable. Reassigning the value of argument only overwrites the local copy of the reference. It does not modify the original string.
As you asked in a comment, if you use a mutable object and you reassign the reference, again this doesn't do what you want - the original object is not affected. If you want to mutate a mutable object you can call a method that mutates it. Simply reassigning a reference does not change the original object.
If you want self.y to point to a new object then you have to assign the object reference directly to self.y.