title: .copy() makes reference to dict not copy Python
body: <p>I have problem with dict's method - copy(),
  I make copy of the &quot;tab_bin&quot; - &quot;HERE 02&quot; in the code and then I modifi it - &quot;HERE 01&quot;.
  And when at the end of code it prints &quot;tab_bin&quot;, it prints modyfied version of &quot;tab_bin&quot;.
  Also I know my code is a litte messy and names of variables look weird because they are in polish.
  My code:</p>
  <pre><code>
  def setting(akcje,n,m):
      def zmiana():
          Zm_1 = []
          Zm_2 = []
          for x in range(akcje[1], akcje[3]+1):
              Zm_1.append(x)
          for y in range(akcje[0], akcje[2]+1):
              Zm_2.append(y)
          return Zm_1, Zm_2
      def kreator_tab():
          if bool(tab_bin) == False:
              for x in range(1, n+1):
                  for y in range(m):
                      tab_bin.setdefault(x, []).append(0)
          for key, value in tab_bin.items():
              for x in Zm_2:
                  if key == x:
                      for y in Zm_1:
                          if value[y-1] == 0:  value[y-1] = 1
                          else:   value[y-1] = 0
  
      def operacje_proste(akcje, liczba_operacji):
          def kreator_zmian():
              ZmX = []
              ZmY = []
              for x in range(1, akcje[1]+1):
                  ZmX.append(x)
              for y in range(1, akcje[0]+1):
                  ZmY.append(y)
              return ZmX, ZmY
          def kreator_tab_prostych():
              for keys, values in tab_operacyjna.items(): # &lt;- HERE 01
                  for x in ZmY:
                      if keys == x:
                          for y in ZmX:
                              if values[y-1] == 0:  values[y-1] = 1
                              else:   values[y-1] = 0
              return liczba_operacji+1
          def d():
              suma =0
              for value in tab_operacyjna.values():
                  for x in value:
                      suma+=x
              if suma == 0:   return  print(liczba_operacji)
              else:
                  return operacje_proste([max(ZmY),max(ZmX)-1], liczba_operacji)
          ZmX,ZmY= kreator_zmian()
          liczba_operacji = kreator_tab_prostych()
          d()
  
      Zm_1, Zm_2 = zmiana()
      kreator_tab()
      tab_operacyjna = tab_bin.copy() # &lt;- HERE 02
      operacje_proste([max(Zm_2),max(Zm_1)], 0)
  
  def wrapper():  
      n = 2 
      m = 3 
      q = 3
      akcje = [1,2,2,2]
      setting(akcje,n,m)
      print(tab_bin)
  wrapper()
  </code></pre>
  <p>[EDIT]:
  Okey, to explain more clearly what I mean I will add <code>print()</code> to the code and show output.
  Code:</p>
  <pre><code>     tab_operacyjna = tab_bin.copy()
       print(tab_bin, &quot;- tab_bin &quot;,tab_operacyjna,&quot;- tab_operacyjna&quot;)
       operacje_proste([max(Zm_2),max(Zm_1)], 0)
       print(tab_bin, &quot;- tab_bin &quot;,tab_operacyjna,&quot;- tab_operacyjna&quot;)
  </code></pre>
  <p>OutPut:
  {1: [0, 1, 0], 2: [0, 1, 0]} - tab_bin {1: [0, 1, 0], 2: [0, 1, 0]} - tab_operacyjna</p>
  <p>{1: [0, 0, 0], 2: [0, 0, 0]} - tab_bin {1: [0, 0, 0], 2: [0, 0, 0]} - tab_operacyjna</p>
  <p>Even if in <code>operacje_proste()</code> I don't use <code>tab_bin</code> it changes just like <code>tab_operacyja</code> on which I make changes. I hope this edit will make it more clear.</p>