diff --git a/values.go b/values.go
index <HASH>..<HASH> 100644
--- a/values.go
+++ b/values.go
@@ -251,6 +251,9 @@ func (n *node) findDescendent(parent *node, key Key, canChange, hasChanged bool)
 func (n *node) findChild(keyPart string, canChange bool) (*node, bool) {
 	changed := false
 	if n.isSet() {
+		if !canChange {
+			return nil, false
+		}
 		n.value, changed = nil, true
 		n.children = map[string]*node{}
 	}
diff --git a/values_test.go b/values_test.go
index <HASH>..<HASH> 100644
--- a/values_test.go
+++ b/values_test.go
@@ -1419,6 +1419,14 @@ func TestNewNode(t *testing.T) {
 	}
 }
 
+func TestNode_findChild_isSetAndCannotChange(t *testing.T) {
+	n := newNodeValue(0)
+	child, changed := n.findChild("", false)
+	if child != nil || changed {
+		t.Fail()
+	}
+}
+
 func testNode(t *testing.T, n *node, value interface{}, childrenNil bool) {
 	if n == nil {
 		t.Error("*node should not be nil")
Updates *node.findChild() and tests.