I think I can demonstrate something to clarify your situation, in your example, this will initially be a representation, but as soon as you try to change it by adding a column, it will turn into a copy. You can verify this by looking at the attribute ._is_view:
In [29]:
df = pd.DataFrame(np.random.randn(5,3), columns=list('abc'))
def doSomething(df):
a = df[['b','c']]
print('before ', a._is_view)
a['d'] = 0
print('after ', a._is_view)
doSomething(df)
df
before True
after False
Out[29]:
a b c
0 0.108790 0.580745 1.820328
1 1.066503 -0.238707 -0.655881
2 -1.320731 2.038194 -0.894984
3 -0.962753 -3.961181 0.109476
4 -1.887774 0.909539 1.318677
, , a df, , , , df .