QST: Is differenence in frame __setitem__() and __getitem__() intended?
- [X] I have searched the [[pandas] tag](https://stackoverflow.com/questions/tagged/pandas) on StackOverflow for similar questions.

- [X] I have discussed my usage related question on [StackOverflow](https://stackoverflow.com).

---
@kristiancanler came across different behavior between assignment and look-ups when using a `dictionary.values()` view object as slice, as documented in his [StackOverflow question](https://stackoverflow.com/questions/66961614/why-does-pandas-recognize-dictionary-values-as-a-list-of-column-names-when-used/67001369#67001369).
We do know how to work around this - as is documented in the question, as well as answers - we just want to know if it is intended.

Creating a DataFrame + dictionary, using `dictionary.values()` as slice in `print()` simply prints the correct column:

```python
import pandas as pd

cols_dict = {'X': 'col1'}

df = pd.DataFrame({'col1': range(2),
                   'col2': range(3, 5)})

print(df[cols_dict.values()])
   col1 
0     0
1     1
```
however using dictionary.values() on assignment yielded unexpected results:
```python

df[cols_dict.values()] = df[cols_dict.values()]

print(df)
   col1  col2  (col1)
0     0     3       0
1     1     4       1
```
Is this expected behavior?
If not, is the reason for this behavior the difference in this part of frame's [`__setitem__()`](https://github.com/pandas-dev/pandas/blob/822db7a53fdcf8d860aaa8b51da4b767b3f56fad/pandas/core/frame.py#L3528-L3536) and [`__getitem__()`](https://github.com/pandas-dev/pandas/blob/822db7a53fdcf8d860aaa8b51da4b767b3f56fad/pandas/core/frame.py#L3368-L3388)?

```python
        # Do we have a slicer (on rows)?
        indexer = convert_to_index_sliceable(self, key)
        if indexer is not None:                                    #!
            if isinstance(indexer, np.ndarray):                    #!
                indexer = lib.maybe_indices_to_slice(              #!
                    indexer.astype(np.intp, copy=False), len(self) #!
                )                                                  #!
            # either we have a slice or we have a string that can be converted
            #  to a slice for partial-string date indexing
            return self._slice(indexer, axis=0)
```

The part with #! is only in `__getitem__()`, not in `__setitem__()`, even though both parts of code start with `indexer = convert_to_index_sliceable(self, key)` and the pre-return comments come to the exact same conclusion as to what indexer could be.