globalne – obejmujące zasięgiem cały program, lokalne – o zasięgu obejmującym pewien blok, podprogram. W językach obsługujących rekurencję zazwyczaj są to zmienne automatyczne, natomiast w językach bez rekurencji mogą być statyczne. Zmienne zadeklarowane w module mogą być zmiennymi prywatnymi modułu – dostępnymi wyłącznie z jego wnętrza – lub zmiennymi publicznymi (eksportowanymi) – dostępnymi tam, gdzie moduł jest wykorzystywany. Podobnie jest ze zmiennymi w klasie – mogą być dostępne: tylko dla danej klasy (zmienna prywatna), dla danej klasy i jej potomków (zmienna chroniona), w całym programie (zmienna publiczna), inne ograniczenia w zależności od języka (np. friend czy internal w .NET). Zmienne mogą zmieniać swój pierwotny zasięg np. poprzez importowanie/włączanie do zasięgu globalnego modułów, pakietów czy przestrzeni nazw.

Ze względu na czas życia i sposób alokacji zmienna może być: statyczna – gdy pamięć dla niej rezerwowana jest w momencie ładowania programu.