diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py
index b2cb1ffb8b33656ddc35c8cd883cd78f98404fda..2ec26ae60c2ecac1da3b8fce53a9c579e23bba09 100644
--- a/pyopencl/cffi_cl.py
+++ b/pyopencl/cffi_cl.py
@@ -666,22 +666,26 @@ def enqueue_nd_range_kernel(queue, kernel,
     work_dim = len(global_work_size)
 
     if local_work_size is not None:
+        global_size_copied = False
         if g_times_l:
             work_dim = max(work_dim, len(local_work_size))
         elif work_dim != len(local_work_size):
-            raise RuntimeError("enqueue_nd_range_kernel", status_code.INVALID_VALUE,
-                                 "global/local work sizes have differing dimensions")
-
-        local_work_size = list(local_work_size)
+            raise RuntimeError("enqueue_nd_range_kernel",
+                               status_code.INVALID_VALUE,
+                               "global/local work sizes have differing dimensions")
 
         if len(local_work_size) < work_dim:
-            local_work_size.extend([1] * (work_dim - len(local_work_size)))
+            local_work_size = (local_work_size +
+                               [1] * (work_dim - len(local_work_size)))
         if len(global_work_size) < work_dim:
-            global_work_size.extend([1] * (work_dim - len(global_work_size)))
-
-    elif g_times_l:
-        for i in xrange(work_dim):
-            global_work_size[i] *= local_work_size[i]
+            global_size_copied = True
+            global_work_size = (global_work_size +
+                                [1] * (work_dim - len(global_work_size)))
+        if g_times_l:
+            if not global_size_copied:
+                global_work_size = list(global_work_size)
+            for i in xrange(work_dim):
+                global_work_size[i] *= local_work_size[i]
 
     if global_work_offset is not None:
         raise NotImplementedError("global_work_offset")