In Python specifically, how do variables get shared between threads?
Although I have used ```threading.Thread``` before I never really understood or saw examples of how variables got shared.  Are they shared between the main thread and the children or only among the children? When would I need to use thread local storage to avoid this sharing?
I have seen many warnings about synchronizing access to shared data among threads by using locks but I have yet to see a really good example of the problem. 
Thanks in advance!
Why is iceberg lettuce bad for rabbits?

Iceberg lettuce contains lactucarium, a milky sap that can cause digestive issues and discomfort in rabbits. Additionally, it is high in water content, which may dilute the rabbit's nutrient intake and lead to diarrhea if consumed in large quantities. It's typically best to avoid feeding iceberg lettuce to rabbits. Instead, opt for leafy greens such as kale, Romaine lettuce, collard greens, or spinach. These greens are more nutrient-dense and safer for rabbit health.
When you create multiple threads in Python, they all have access to the same global and non-local variables that are defined in the same scope as the thread functions. This is because Python uses a Global Interpreter Lock (GIL) which serializes access to Python objects, effectively making all threads the same thread for the sake of variable access.

However, when multiple threads access and modify the same variable, it can lead to unpredictable behavior and data races. To avoid this, you need to synchronize access to shared variables. One common way to do this is by using locks, as you mentioned. Here