code: func (v *Vars) assign(th *starlark.Thread, id ID, value starlark.Value, auto bool) error {
  	// Forbid sneaky cross-scope communication through in-place mutations of the
  	// variable's value.
  	value.Freeze()
  
  	// Remember where assignment happened, for the error message in Set().
  	trace, err := builtins.CaptureStacktrace(th, 0)
  	if err != nil {
  		return err
  	}
  
  	// Set in the innermost scope.
  	scope := v.scopes[len(v.scopes)-1]
  	if scope.values == nil {
  		scope.values = make(map[ID]varValue, 1)
  	}
  	scope.values[id] = varValue{value, trace, auto}
  	return nil
  }
docs: // assign sets the variable's value in the innermost scope.