A slight practical perspective to look into memory through id and gc.
>>> b = a = ['hell', 'word']>>> c = ['hell', 'word']>>> id(a), id(b), id(c)(4424020872, 4424020872, 4423979272) | | ----------->>> id(a[0]), id(b[0]), id(c[0])(4424018328, 4424018328, 4424018328) # all referring to same 'hell' | | | ----------------------->>> id(a[0][0]), id(b[0][0]), id(c[0][0])(4422785208, 4422785208, 4422785208) # all referring to same 'h' | | | ----------------------->>> a[0] += 'o'>>> a,b,c(['hello', 'word'], ['hello', 'word'], ['hell', 'word']) # b changed too>>> id(a[0]), id(b[0]), id(c[0])(4424018384, 4424018384, 4424018328) # augmented assignment changed a[0],b[0] | | ----------->>> b = a = ['hell', 'word']>>> id(a[0]), id(b[0]), id(c[0])(4424018328, 4424018328, 4424018328) # the same hell | | | ----------------------->>> import gc>>> gc.get_referrers(a[0]) [['hell', 'word'], ['hell', 'word']] # one copy belong to a,b, the another for c>>> gc.get_referrers(('hell'))[['hell', 'word'], ['hell', 'word'], ('hell', None)] # ('hello', None)