title: Override setter for multidimensional array
body: <p>I am trying to override setter and decorate it, but don't understand how it works for multidimensional array.</p>
  <pre><code>class Board:
      def __init__(self):
          self.board = []
          for k in range(3):
              self.board.append([0] * 3)
  
      def __str__(self):
          return '\n'.join([' '.join([str(num) for num in row]) for row in self.board])
  
      def __repr__(self):
          return self.__str__()
  
      def __setitem__(self, item, value):
          print(f'setting {item=}\t\t{value=}')
          self.board[item] = value
  
      def __getitem__(self, item):
          print(f'getting {item=}')
          return self.board[item]
  </code></pre>
  <p>I found out, that setter/getter doesn't work as I expect</p>
  <pre><code>&gt;&gt;&gt; board = Board()
  &gt;&gt;&gt; print(board)
  0 0 0
  0 0 0
  0 0 0
  &gt;&gt;&gt; print(board[1][1])
  getting item=1
  0
  &gt;&gt;&gt; board[1][1] = 3
  getting item=1
  </code></pre>
  <p>I expected, that setter will work here, but I think that getter returns list and modifies element of that list.</p>
  <pre><code>&gt;&gt;&gt; print(board)
  0 0 0
  0 3 0
  0 0 0
  &gt;&gt;&gt; board[0] = [1, 3, 1]
  setting item=0      value=[1, 3, 1]
  &gt;&gt;&gt; print(board)
  1 3 1
  0 3 0
  0 0 0
  </code></pre>
  <p>Setter works only if I use no more than 1 index.</p>