diff --git a/cpu/cpujit.py b/cpu/cpujit.py
index cdb73b82c7b40d7cd7eef9a727f0beede6bdcb4c..02d9291aa397e1488b4e9df603f6d9b74425643e 100644
--- a/cpu/cpujit.py
+++ b/cpu/cpujit.py
@@ -430,6 +430,7 @@ def makePythonFunctionIncompleteParams(kernelFunctionNode, argumentDict):
     parameters = kernelFunctionNode.parameters
 
     cache = {}
+    cacheValues = []
 
     def wrapper(**kwargs):
         key = hash(tuple((k, id(v)) for k, v in kwargs.items()))
@@ -441,6 +442,7 @@ def makePythonFunctionIncompleteParams(kernelFunctionNode, argumentDict):
             fullArguments.update(kwargs)
             args = buildCTypeArgumentList(parameters, fullArguments)
             cache[key] = args
+            cacheValues.append(kwargs)  # keep objects alive such that ids remain unique
             func(*args)
     return wrapper
 
diff --git a/gpucuda/cudajit.py b/gpucuda/cudajit.py
index 0b18c1359f88b7ee57a51d359123611e3da45270..299492d635a9e66b1021623ee1aafac36c4df743 100644
--- a/gpucuda/cudajit.py
+++ b/gpucuda/cudajit.py
@@ -29,6 +29,7 @@ def makePythonFunction(kernelFunctionNode, argumentDict={}):
     parameters = kernelFunctionNode.parameters
 
     cache = {}
+    cacheValues = []
 
     def wrapper(**kwargs):
         key = hash(tuple((k, id(v)) for k, v in kwargs.items()))
@@ -45,6 +46,7 @@ def makePythonFunction(kernelFunctionNode, argumentDict={}):
 
             args = _buildNumpyArgumentList(parameters, fullArguments)
             cache[key] = (args, dictWithBlockAndThreadNumbers)
+            cacheValues.append(kwargs)  # keep objects alive such that ids remain unique
             func(*args, **dictWithBlockAndThreadNumbers)
         #cuda.Context.synchronize() # useful for debugging, to get errors right after kernel was called
     return wrapper