In some programming languages, using a data object required that the programmer reserve some memory for the object before even creating it. After the program was done with the data object, it had to explicitly free the memory previously reserved for it, or that memory would have staid reserved for an object that is no longer referenced in the program and was therefore wasted. Problems like these are called memory leaks.
In modern dynamic programming languages, like Python, memory is reserved for objects automatically and is kept as long as the object is being referenced in the application. Once the object is not being referenced anywhere in the applications, a garbage collection system can automatically destroy it and free the memory it is using.
Still, in these programming langauges, effective memory leaks can still happen if an object is not being referenced while it is not needed or used anymore in the application. In some cases, applications want to keep references to objects only as long as they are being referenced somewhere else. This is what is called a weak reference. A weak reference can point to the object, but will not prevent garbage collection if aren't any other (non-weak) references to the object.
One example of how a weak reference can be useful is keeping track of the current variables being referenced in the application. This list must have weak links to the objects. Otherwise, once objects are added to the list, they will be referenced by it and will persist forever (or until the program stops).