Despite share the same keywords, that's not a for loop; it's a list comprehension nested in another list comprehension. As such, you need to evaluate the inner list first:
[
[int(input("Enter value for {}. row and {}. column: ".format(r + 1, c + 1)))
for c in range(n_cols)
]
for r in range(n_rows)
]
If you were to "unroll" the inner one, it would look like
[
[
int(input("Enter value for {}. row and {}. column: ".format(r + 1, 1))),
int(input("Enter value for {}. row and {}. column: ".format(r + 1, 2))),
# ...
int(input("Enter value for {}. row and {}. column: ".format(r + 1, n_cols-1))),
]
for r in range(n_rows)
]
and further unrolling the outer one would result in
[
[
int(input("Enter value for {}. row and {}. column: ".format(1, 1))),
int(input("Enter value for {}. row and {}. column: ".format(1, 2))),
# ...
int(input("Enter value for {}. row and {}. column: ".format(1, n_cols-1))),
],
[
int(input("Enter value for {}. row and {}. column: ".format(2, 1))),
int(input("Enter value for {}. row and {}. column: ".format(2, 2))),
# ...
int(input("Enter value for {}. row and {}. column: ".format(2, n_cols-1))),
],
# ...
[
int(input("Enter value for {}. row and {}. column: ".format(n_rows-1, 1))),
int(input("Enter value for {}. row and {}. column: ".format(n_rows-1, 2))),
# ...
int(input("Enter value for {}. row and {}. column: ".format(n_rows-1, n_cols-1))),
]
]