Hi,
if you look to colnames(cbind(l1,l2)) you will see that the column names are l1 and l2. as.data.frame just takes the column names as names for the variables.
Note that l1and df$l1 as well as l2 and df$l2 are different objects:
l1 <- list("A", "G", "D")
l2 <- list(1,2,4)
df <- as.data.frame(cbind(l1, l2))
l2[[3]] <- 8 # now l2 and df$l2 are different
l2
df$l2