You should avoid using any kind of global variables and always store your data in the smallest possible scope. This is one of the principles of good design.
The code is so clearer easier to understand, maintain, reuse and change. Dependencies are kept low.
Imagine you need to change this code in the future. If you touch a global variable, you might possibly break some code on the other side (as other methods can use the same variable). If it is localizes, you just need to analyse the impact inside of the method.
Besides, the method with parameters is nicelly encapsulated and its signature is self-explanatory. YOu can even possibly reuse it in the future!
UPDATE
There are a lots of resources on internet, here is a good start: http://www.oodesign.com/design-principles.html
In your case the use of global variables clearly breaks the Open-closed Principle:
Software entities like classes, modules and functions should be open for extension but closed for modifications.
If you use the global variable instead of sending parameter (Teacher.Students), your method is obviously not closed for modifications, as any change to this global variable (not part of the method!) cause potential crash in the method. With the parameter, your method is closed and protected.