_update():  Commented the new obscurity.  Materialized into a tuple
instead of into a list for a bit of speed/space savings.  Reopened the
bug report too (628246), as I'm unclear on why we don't sort out the
cause of the TypeError instead.
diff --git a/Lib/sets.py b/Lib/sets.py
index bbb93a0..5a66a2e 100644
--- a/Lib/sets.py
+++ b/Lib/sets.py
@@ -319,10 +319,16 @@
             data.update(iterable)
             return
 
-        value = True
+        # If the mere process of iterating may raise TypeError, materialize
+        # the iterable into a tuple first.  Then the TypeError will get
+        # raised here and propagated back to the caller.  Once we get into
+        # the loop following, TypeError is assumed to mean that element
+        # can't be used as a dict key.
         if type(iterable) not in (list, tuple, dict, file, xrange, str):
-            iterable = list(iterable)
+            iterable = tuple(iterable)
+
         it = iter(iterable)
+        value = True
         while True:
             try:
                 for element in it: