One of the main criticisms of Lua is that the scope of a variable is global by default. This is not perfect, and people who have worked with me know I don't like useless globals.
That being said, I think the solution some people advocate ("Do like Python!!1") is "wrong". Global by default is clumsy but it makes sense because there is only one global scope. Local by default and a "global" keyword causes aliasing issues because there are other levels of scope besides "local" and "global".
Instead of a long explanation, let's take an example: you cannot do this in Python.
a = 1
do
local a
do a = 2 end
do print(a) end
print(a)
end
print(a)
Note: I would prefer nothing by default (i.e. make declaration of globals explicit via a language keyword, not declaring is an error) instead of the current situation (doing this with tricks like strict.lua). However that would make it harder to use Lua as a configuration language and things like that.
Oh, so Python 3 has a way to do this! When I use Python it is still 2.7, so I hadn't noticed it. I still prefer Lua's way though, but this is nice.