I've created a script that allows me to grab a part. The arm can also be moved used Q and E. When the arm moves, the part that is being grabbed needs to stay updated with the hand but only when "z" is being pressed down (InputBegan). After input has ended the .Changed function (that keeps the part updated) is still fired, even though z is not being pressed and has been disconnected in the InputEnded function. Why is this?

local player = game:GetService('Players').LocalPlayer
local character = script.Parent

local hand1 = character:WaitForChild('Part1')
local hand2 = character:WaitForChild('Part2')
local uis = game:GetService("UserInputService")

local welds = {}
connection = nil
nection = nil

uis.InputBegan:Connect(function(input)
    if input.KeyCode == Enum.KeyCode.Z then
        connection = hand1.Touched:Connect(function(touching)
				if touching.Name == "Part" then
					touching.CFrame = hand1.CFrame
						nection = hand1.Changed:Connect(function()
              				touching.CFrame = hand1.CFrame
							wait()
						end)
                welds[#welds + 1] = Instance.new('WeldConstraint')
                welds[#welds].Parent = touching
                welds[#welds].Part0 = touching
                welds[#welds].Part1 = hand1
			end
        end)
    end
end)

uis.InputEnded:Connect(function(input)
	print("work1")
    if input.KeyCode == Enum.KeyCode.Z then
	print("work2")
		if connection then
        	connection:Disconnect()
			connection = nil
			print("work3")
		if nection then
			nection:Disconnect()
			nection = nil
			print("work4")
		end
		end
    end
    
    --// delete all welds
    for i,v in pairs(welds) do
        v:Destroy()
    end
    welds = {}
end)