словарь Python, переданный в качестве входных данных для функции, действует как глобальный в этой функции, а не как локальный

Я очень смущен поведением ниже. Случаи 1, 3 и 4 работают так, как я ожидал, а случай 2 - нет. Почему случай 2 позволяет функции изменять значение словарной записи глобально, даже если функция никогда не возвращает словарь? Основная причина, по которой я использую функции, состоит в том, чтобы изолировать все в функции от остальной части кода, но это кажется невозможным, если я решу использовать те же имена переменных внутри функции. Я понимал, что что-либо явно определенное в функции является локальным для этой функции, но это не так, если словарьопределяется и передается в качестве входа в функцию.

Python 2.7.2+ (default, Oct  4 2011, 20:06:09) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.

============= Случай 1 ===============

>>> def testfun1(a):
...     a=2
... 
>>> a=0
>>> testfun1(a)
>>> a
0

============= Случай 2 ===============

>>> def testfun2(b):
...     b['test']=2
... 
>>> b={}
>>> testfun2(b)
>>> b
{'test': 2}

============= Случай 3 ===============

>>> def testfun3():
...     c=2
... 
>>> c=0
>>> testfun3()
>>> c
0

============= Случай 4 =============== (объясняется с помощью этого вопроса:Глобальным словарям не нужно ключевое слово global для их изменения?)

>>> def testfun4():
...     d['test']=10
... 
>>> d={}
>>> testfun4()
>>> d
{'test': 10}

Ответы на вопрос(4)

Ваш ответ на вопрос