This isn't technically lazy evaluation, it's short-circuit boolean expressions.
Lazy evaluation has a somewhat different connotation. For example, true lazy evaluation would likely allow this
def foo(arg) :
print "Couldn't care less"
foo([][0])
But Python doesn't.
Python is also nice in that it "echos" it's boolean arguments. For example, an or condition returns either it's first "truthy" argument or the last argument (if all arguments are "falsey"). An and condition does the inverse.
So "echo argument" booleans means
2 and [] and 1
evaluates to [], and
[] or 1 or 2
evaluates to 1