Why this happens? shouldn't the list (with overhead) be bigger than string?
import sys
print(sys.getsizeof('a'*1000)) # output is 1049
print(sys.getsizeof(['a'*1000])) # output is 72
You are just getting the size of the list object, not what's inside of the list.
You can see the size of what's inside the iterable by looping over the list:
print(sys.getsizeof('a'*1000)) # 1049
print(sys.getsizeof(['a'*1000])) # 72
myl = ['a'*1000]
for x in myl:
print(sys.getsizeof(x)) # 1049
myl2 = []
print(sys.getsizeof(myl2)) # 64
myl2 = ['a']
print(sys.getsizeof(myl2)) # 72