Это классический python gotcha
G = [[] for i in range(numCourses)]
создает numCourses
новый пустой список, тогда как
G1 = [[]]*numCourses
сначала создает (внутренний) пустой список, а затем список, состоящий изnumCourses
копий этого.Вот почему при изменении одного списка в G1
все они меняются.