There is actually a difference between the semantics of assigning scalars and iterables (think containers such as lists as list-like objects).
Consider,
df = pd.DataFrame(columns=['1', '2'])
df
Empty DataFrame
Columns: [1, 2]
Index: []
You've defined an empty dataframe without any index (no rows), but only a schema for the columns.
When you assign a scalar to a column, the assignment is broadcast across all rows. In this case, since there are none, nothing happens:
df['1'] = 123
df
Empty DataFrame
Columns: [1, 2]
Index: []
However, assigning a list-like iterable is a different story, as pandas will create new rows for it:
df['1'] = [123]
df
1 2
0 123 NaN
Now, to understand how scalar assignment works, consider a similar empty DataFrame, but with a defined index:
df = pd.DataFrame(columns=['1', '2'], index=[0, 1])
df
1 2
0 NaN NaN
1 NaN NaN
it is still "empty" (not really), but now we can assign scalars and the assignment is broadcast,
df['1'] = 123
df
1 2
0 123 NaN
1 123 NaN
Contrast this behaviour with that previously shown.