I dunno if I'd say that's an issue of Python not having proper closures, or just that before you could say 'nonlocal' there was no way to refer to the outer scope, since the only scopes you could refer to were 'local' and 'global'.
> In pre Python 3, the closed over value isn't mutable unless it's a reference to a mutable object.
> Proper closures were added in Python 2.2 (which is quite old at this point), not Python 3.
x is a reference to a mutable object(list), and it's not x which is mutated but what x refers to. Pre python 3 doesn't have proper closures - ways to emulate it, yes. Proper closures - no.
Python closes over names, not objects. This is consistent with the rest of Python, which treats names as references to objects rather than variables which hold objects. I do agree that it's confusing for people used to closures and used to languages with different semantics.
I haven't used Java a lot either, but from what I have done Python's function seems more similar to JavaScript than to Java.