First a link to a presentation everyone should read:
Now some additional methods:
List @@ Unevaluated /@ Hold[a1, a2, a3] Unevaluated /@ Unevaluated @ {a1, a2, a3} More contrived:
Unevaluated @@@ Thread @ Hold[{a1, a2, a3}] {Unevaluated /@ Hold[a1, a2, a3]} // ReleaseHold Delete[{Unevaluated /@ Hold[a1, a2, a3]}, {1, 0}]