diff --git a/Lib/calendar.py b/Lib/calendar.py
index ee16c76..f00268b 100644
--- a/Lib/calendar.py
+++ b/Lib/calendar.py
@@ -16,7 +16,7 @@
 
 # Return 1 for leap years, 0 for non-leap years
 def isleap(year):
-	return year % 4 = 0 and (year % 100 <> 0 or year % 400 = 0)
+	return year % 4 == 0 and (year % 100 <> 0 or year % 400 == 0)
 
 # Constants for months referenced later
 January = 1
@@ -45,7 +45,7 @@
 	yday = days
 	month = January
 	while 1:
-		md = mdays[month] + (month = February and isleap(year))
+		md = mdays[month] + (month == February and isleap(year))
 		if days < md: break
 		days = days - md
 		month = month + 1
@@ -122,7 +122,7 @@
 # Return weekday (0-6 ~ Mon-Sun) and number of days (28-31) for year, month
 def monthrange(year, month):
 	day1 = weekday(year, month, 1)
-	ndays = mdays[month] + (month = February and isleap(year))
+	ndays = mdays[month] + (month == February and isleap(year))
 	return day1, ndays
 
 # Return a matrix representing a month's calendar
@@ -161,7 +161,7 @@
 # Print a single week (no newline)
 def prweek(week, width):
 	for day in week:
-		if day = 0: print ' '*width,
+		if day == 0: print ' '*width,
 		else:
 			if width > 2: print ' '*(width-3),
 			if day < 10: print '',
diff --git a/Lib/cmp.py b/Lib/cmp.py
index 32b77fa..1b48c67 100644
--- a/Lib/cmp.py
+++ b/Lib/cmp.py
@@ -19,7 +19,7 @@
 	if s1[0] <> 8 or s2[0] <> 8:
 		# Either is a not a plain file -- always report as different
 		return 0
-	if s1 = s2:
+	if s1 == s2:
 		# type, size & mtime match -- report same
 		return 1
 	if s1[:2] <> s2[:2]: # Types or sizes differ, don't bother
@@ -30,7 +30,7 @@
 	try:
 		cs1, cs2, outcome = cache[key]
 		# cache hit
-		if s1 = cs1 and s2 = cs2:
+		if s1 == cs1 and s2 == cs2:
 			# cached signatures match
 			return outcome
 		# stale cached signature(s)
diff --git a/Lib/cmpcache.py b/Lib/cmpcache.py
index e846f58..20202e2 100644
--- a/Lib/cmpcache.py
+++ b/Lib/cmpcache.py
@@ -29,7 +29,7 @@
 	if not S_ISREG(s1[0]) or not S_ISREG(s2[0]):
 		# Either is a not a plain file -- always report as different
 		return 0
-	if s1 = s2:
+	if s1 == s2:
 		# type, size & mtime match -- report same
 		return 1
 	if s1[:2] <> s2[:2]: # Types or sizes differ, don't bother
@@ -40,7 +40,7 @@
 	if cache.has_key(key):
 		cs1, cs2, outcome = cache[key]
 		# cache hit
-		if s1 = cs1 and s2 = cs2:
+		if s1 == cs1 and s2 == cs2:
 			# cached signatures match
 			return outcome
 		# stale cached signature(s)
diff --git a/Lib/commands.py b/Lib/commands.py
index 4d16eef..a6084a5 100644
--- a/Lib/commands.py
+++ b/Lib/commands.py
@@ -25,8 +25,8 @@
 	pipe = posix.popen('{ ' + cmd + '; } 2>&1', 'r')
 	text = pipe.read()
 	sts = pipe.close()
-	if sts = None: sts = 0
-	if text[-1:] = '\n': text = text[:-1]
+	if sts == None: sts = 0
+	if text[-1:] == '\n': text = text[:-1]
 	return sts, text
 
 
diff --git a/Lib/dircmp.py b/Lib/dircmp.py
index 0c6b4a7..f4eea1f 100644
--- a/Lib/dircmp.py
+++ b/Lib/dircmp.py
@@ -174,7 +174,7 @@
 #
 def remove(list, item):
 	for i in range(len(list)):
-		if list[i] = item:
+		if list[i] == item:
 			del list[i]
 			break
 
diff --git a/Lib/dis.py b/Lib/dis.py
index 7eaaeaf..28faee0 100644
--- a/Lib/dis.py
+++ b/Lib/dis.py
@@ -22,8 +22,8 @@
 	while i < n:
 		c = code[i]
 		op = ord(c)
-		if op = SET_LINENO and i > 0: print # Extra blank line
-		if i = lasti: print '-->',
+		if op == SET_LINENO and i > 0: print # Extra blank line
+		if i == lasti: print '-->',
 		else: print '   ',
 		if i in labels: print '>>',
 		else: print '  ',
diff --git a/Lib/dump.py b/Lib/dump.py
index cecc275..ec895b7 100644
--- a/Lib/dump.py
+++ b/Lib/dump.py
@@ -31,7 +31,7 @@
 def dumpvar(name, x):
 	import sys
 	t = type(x)
-	if t = type({}):
+	if t == type({}):
 		print name, '= {}'
 		for key in x.keys():
 			item = x[key]
@@ -42,7 +42,7 @@
 		if not printable(x):
 			print '#',
 		print name, '=', `x`
-	elif t = type(sys):
+	elif t == type(sys):
 		print 'import', name, '#', x
 	else:
 		print '#', name, '=', x
@@ -58,6 +58,6 @@
 			if not printable(item):
 				return 0
 		return 1
-	if x = {}:
+	if x == {}:
 		return 1
 	return 0
diff --git a/Lib/fnmatch.py b/Lib/fnmatch.py
index 1e7dbb3..549e0e7 100644
--- a/Lib/fnmatch.py
+++ b/Lib/fnmatch.py
@@ -5,64 +5,70 @@
 	# Check for simple case: no special characters
 	#
 	if not ('*' in pat or '?' in pat or '[' in pat):
-		return name = pat
+		return name == pat
 	#
 	# Check for common cases: *suffix and prefix*
 	#
-	if pat[0] = '*':
+	if pat[0] == '*':
 		p1 = pat[1:]
 		if not ('*' in p1 or '?' in p1 or '[' in p1):
 			start = len(name) - len(p1)
-			return start >= 0 and name[start:] = p1
-	elif pat[-1:] = '*':
+			return start >= 0 and name[start:] == p1
+	elif pat[-1:] == '*':
 		p1 = pat[:-1]
 		if not ('*' in p1 or '?' in p1 or '[' in p1):
-			return name[:len(p1)] = p1
+			return name[:len(p1)] == p1
 	#
 	# General case
 	#
 	return fnmatch1(name, pat)
 
 def fnmatch1(name, pat):
-	for i in range(len(pat)):
+	i, n = 0, len(pat)
+	while i < n:
 		c = pat[i]
-		if c = '*':
+		if c == '*':
 			p1 = pat[i+1:]
 			if not ('*' in p1 or '?' in p1 or '[' in p1):
 				start = len(name) - len(p1)
-				return start >= 0 and name[start:] = p1
+				return start >= 0 and name[start:] == p1
 			for i in range(i, len(name) + 1):
 				if fnmatch1(name[i:], p1):
 					return 1
 			return 0
-		elif c = '?':
+		elif c == '?':
 			if len(name) <= i : return 0
-		elif c = '[':
+		elif c == '[':
 			c, rest = name[i], name[i+1:]
 			i, n = i+1, len(pat) - 1
 			match = 0
 			exclude = 0
-			if i < n and pat[i] = '!':
+			if i < n and pat[i] == '!':
 				exclude = 1
 				i = i+1
 			while i < n:
-				if pat[i] = c: match = 1
+				if pat[i] == c: match = 1
 				i = i+1
-				if i >= n or pat[i] = ']':
+				if i >= n or pat[i] == ']':
 					break
-				if pat[i] = '-':
+				if pat[i] == '-':
 					i = i+1
-					if i >= n or pat[i] = ']':
+					if i >= n or pat[i] == ']':
 						break
-					match = (pat[i-2] <= c <= pat[i])
+					if pat[i-2] <= c <= pat[i]:
+						match = 1
 					i = i+1
-			if match = exclude:
+					if i >= n or pat[i] == ']':
+						break
+			if match == exclude:
 				return 0
 			return fnmatch1(rest, pat[i+1:])
 		else:
 			if name[i:i+1] <> c:
 				return 0
-	return 1
+		i = i+1
+	# We don't get here if the pattern contained * or [...]
+	return i >= len(name)
 
 def fnmatchlist(names, pat):
 	res = []
diff --git a/Lib/getopt.py b/Lib/getopt.py
index ef72fbc..0b71d0f 100644
--- a/Lib/getopt.py
+++ b/Lib/getopt.py
@@ -22,15 +22,15 @@
 
 def getopt(args, options):
     list = []
-    while args and args[0][0] = '-' and args[0] <> '-':
-    	if args[0] = '--':
+    while args and args[0][0] == '-' and args[0] <> '-':
+    	if args[0] == '--':
     	    args = args[1:]
     	    break
     	optstring, args = args[0][1:], args[1:]
     	while optstring <> '':
     	    opt, optstring = optstring[0], optstring[1:]
     	    if classify(opt, options): # May raise exception as well
-    	    	if optstring = '':
+    	    	if optstring == '':
     	    	    if not args:
     	    	    	raise error, 'option -' + opt + ' requires argument'
     	    	    optstring, args = args[0], args[1:]
@@ -42,6 +42,6 @@
 
 def classify(opt, options): # Helper to check type of option
     for i in range(len(options)):
-	if opt = options[i] <> ':':
-	    return options[i+1:i+2] = ':'
+	if opt == options[i] <> ':':
+	    return options[i+1:i+2] == ':'
     raise error, 'option -' + opt + ' not recognized'
diff --git a/Lib/glob.py b/Lib/glob.py
index e29095c..4c7e084 100644
--- a/Lib/glob.py
+++ b/Lib/glob.py
@@ -7,7 +7,7 @@
 def glob(pathname):
 	if not has_magic(pathname): return [pathname]
 	dirname, basename = path.split(pathname)
-	if dirname[-1:] = '/' and dirname <> '/':
+	if dirname[-1:] == '/' and dirname <> '/':
 		dirname = dirname[:-1]
 	if has_magic(dirname):
 		list = glob(dirname)
@@ -34,9 +34,10 @@
 		names = posix.listdir(dirname)
 	except posix.error:
 		return []
+	names.sort()
 	result = []
 	for name in names:
-		if name[0] <> '.' or pattern[0] = '.':
+		if name[0] <> '.' or pattern[0] == '.':
 			if fnmatch.fnmatch(name, pattern): result.append(name)
 	return result
 
diff --git a/Lib/grep.py b/Lib/grep.py
index bfee3f5..21ef8d8 100644
--- a/Lib/grep.py
+++ b/Lib/grep.py
@@ -30,7 +30,7 @@
 			prefix = string.rjust(`lineno`, 3) + ': '
 			print prefix + line
 			if 0: # XXX
-				start, end = prog.regs()[0]
+				start, end = prog.regs[0]
 				line = line[:start]
 				if '\t' not in line:
 					prefix = ' ' * (len(prefix) + start)
diff --git a/Lib/irix5/auds.py b/Lib/irix5/auds.py
index 549c0a7..fb992a9 100755
--- a/Lib/irix5/auds.py
+++ b/Lib/irix5/auds.py
@@ -69,7 +69,7 @@
 			ib = ib+b
 		if i >= m:
 			break
-		if ib = ja:
+		if ib == ja:
 			out.append(y[i])
 		else:
 			out.append((y[i]*(ja-(ib-b)) + y[i-1]*(ib-ja)) / b)
diff --git a/Lib/irix5/flp.py b/Lib/irix5/flp.py
index 71a8f66..dfbad01 100755
--- a/Lib/irix5/flp.py
+++ b/Lib/irix5/flp.py
@@ -49,7 +49,7 @@
 def _open_formfile(filename):
     if filename[-3:] <> '.fd':
 	filename = filename + '.fd'
-    if filename[0] = '/':
+    if filename[0] == '/':
 	try:
 	    fp = open(filename,'r')
 	except IOError:
@@ -62,7 +62,7 @@
 		break
 	    except IOError:
 		fp = None
-    if fp = None:
+    if fp == None:
 	raise error, 'Cannot find forms file ' + filename
     return fp
 
@@ -77,7 +77,7 @@
     # Now skip until we know number of forms
     while 1:
 	datum = _parse_1_line(file)
-	if type(datum) = type(()) and datum[0] = 'Numberofforms':
+	if type(datum) == type(()) and datum[0] == 'Numberofforms':
 	    break
     return datum[1]
 #
@@ -89,7 +89,7 @@
     if datum <> FORMLINE:
 	raise error, 'Missing === FORM === line'
     form = _parse_object(file)
-    if form.Name = name or name = None:
+    if form.Name == name or name == None:
 	objs = []
 	for j in range(form.Numberofobjects):
 	    obj = _parse_object(file)
@@ -147,7 +147,7 @@
     if not a:
 	return line
     name = line[:a[1][1]]
-    if name[0] = 'N':
+    if name[0] == 'N':
 	    name = string.joinfields(string.split(name),'')
 	    name = string.lower(name)
     name = string.upper(name[0]) + name[1:]
@@ -167,7 +167,7 @@
 	
 def _parse_1_line(file):
     line = _readline(file)
-    while line = '':
+    while line == '':
 	line = _readline(file)
     return _parse_line(line)
 
@@ -176,7 +176,7 @@
     while not line in (SPLITLINE, FORMLINE, ENDLINE):
 	pos = file.tell()
 	line = _readline(file)
-    if line = FORMLINE:
+    if line == FORMLINE:
 	file.seek(pos)
 
 def _parse_object(file):
@@ -185,7 +185,7 @@
 	pos = file.tell()
 	datum = _parse_1_line(file)
 	if datum in (SPLITLINE, FORMLINE, ENDLINE):
-	    if datum = FORMLINE:
+	    if datum == FORMLINE:
 		file.seek(pos)
 	    return obj
 	if type(datum) <> type(()):
@@ -266,27 +266,27 @@
 # Internal crfunc: helper function that returns correct create function
 #
 def _select_crfunc(fm, cl):
-    if cl = FL.BEGIN_GROUP: return fm.bgn_group
-    elif cl = FL.END_GROUP: return fm.end_group
-    elif cl = FL.BITMAP: return fm.add_bitmap
-    elif cl = FL.BOX: return fm.add_box
-    elif cl = FL.BROWSER: return fm.add_browser
-    elif cl = FL.BUTTON: return fm.add_button
-    elif cl = FL.CHART: return fm.add_chart
-    elif cl = FL.CHOICE: return fm.add_choice
-    elif cl = FL.CLOCK: return fm.add_clock
-    elif cl = FL.COUNTER: return fm.add_counter
-    elif cl = FL.DIAL: return fm.add_dial
-    elif cl = FL.FREE: return fm.add_free
-    elif cl = FL.INPUT: return fm.add_input
-    elif cl = FL.LIGHTBUTTON: return fm.add_lightbutton
-    elif cl = FL.MENU: return fm.add_menu
-    elif cl = FL.POSITIONER: return fm.add_positioner
-    elif cl = FL.ROUNDBUTTON: return fm.add_roundbutton
-    elif cl = FL.SLIDER: return fm.add_slider
-    elif cl = FL.VALSLIDER: return fm.add_valslider
-    elif cl = FL.TEXT: return fm.add_text
-    elif cl = FL.TIMER: return fm.add_timer
+    if cl == FL.BEGIN_GROUP: return fm.bgn_group
+    elif cl == FL.END_GROUP: return fm.end_group
+    elif cl == FL.BITMAP: return fm.add_bitmap
+    elif cl == FL.BOX: return fm.add_box
+    elif cl == FL.BROWSER: return fm.add_browser
+    elif cl == FL.BUTTON: return fm.add_button
+    elif cl == FL.CHART: return fm.add_chart
+    elif cl == FL.CHOICE: return fm.add_choice
+    elif cl == FL.CLOCK: return fm.add_clock
+    elif cl == FL.COUNTER: return fm.add_counter
+    elif cl == FL.DIAL: return fm.add_dial
+    elif cl == FL.FREE: return fm.add_free
+    elif cl == FL.INPUT: return fm.add_input
+    elif cl == FL.LIGHTBUTTON: return fm.add_lightbutton
+    elif cl == FL.MENU: return fm.add_menu
+    elif cl == FL.POSITIONER: return fm.add_positioner
+    elif cl == FL.ROUNDBUTTON: return fm.add_roundbutton
+    elif cl == FL.SLIDER: return fm.add_slider
+    elif cl == FL.VALSLIDER: return fm.add_valslider
+    elif cl == FL.TEXT: return fm.add_text
+    elif cl == FL.TIMER: return fm.add_timer
     else:
 	raise error, 'Unknown object type: ' + `cl`
 
diff --git a/Lib/irix5/panel.py b/Lib/irix5/panel.py
index 9fda1c6..21a17ba 100755
--- a/Lib/irix5/panel.py
+++ b/Lib/irix5/panel.py
@@ -17,7 +17,7 @@
 # Test if an object is a list.
 #
 def is_list(x):
-	return type(x) = type([])
+	return type(x) == type([])
 
 
 # Reverse a list.
@@ -34,7 +34,7 @@
 #
 def getattrlist(list, name):
 	for item in list:
-		if item and is_list(item) and item[0] = name:
+		if item and is_list(item) and item[0] == name:
 			return item[1:]
 	return []
 
@@ -43,8 +43,8 @@
 #
 def getproplist(list, name):
 	for item in list:
-		if item and is_list(item) and item[0] = 'prop':
-			if len(item) > 1 and item[1] = name:
+		if item and is_list(item) and item[0] == 'prop':
+			if len(item) > 1 and item[1] == name:
 				return item[2:]
 	return []
 
@@ -53,7 +53,7 @@
 #
 def is_endgroup(list):
 	x = getproplist(list, 'end-of-group')
-	return (x and x[0] = '#t')
+	return (x and x[0] == '#t')
 
 
 # Neatly display an actuator definition given as S-expression
@@ -63,13 +63,13 @@
 	for item in a:
 		if not is_list(item):
 			print prefix, item
-		elif item and item[0] = 'al':
+		elif item and item[0] == 'al':
 			print prefix, 'Subactuator list:'
 			for a in item[1:]:
 				show_actuator(prefix + '    ', a)
-		elif len(item) = 2:
+		elif len(item) == 2:
 			print prefix, item[0], '=>', item[1]
-		elif len(item) = 3 and item[0] = 'prop':
+		elif len(item) == 3 and item[0] == 'prop':
 			print prefix, 'Prop', item[1], '=>',
 			print item[2]
 		else:
@@ -82,13 +82,13 @@
 	for item in p:
 		if not is_list(item):
 			print prefix, item
-		elif item and item[0] = 'al':
+		elif item and item[0] == 'al':
 			print prefix, 'Actuator list:'
 			for a in item[1:]:
 				show_actuator(prefix + '    ', a)
-		elif len(item) = 2:
+		elif len(item) == 2:
 			print prefix, item[0], '=>', item[1]
-		elif len(item) = 3 and item[0] = 'prop':
+		elif len(item) == 3 and item[0] == 'prop':
 			print prefix, 'Prop', item[1], '=>',
 			print item[2]
 		else:
@@ -112,14 +112,14 @@
 #
 def assign_members(target, attrlist, exclist, prefix):
 	for item in attrlist:
-		if is_list(item) and len(item) = 2 and item[0] not in exclist:
+		if is_list(item) and len(item) == 2 and item[0] not in exclist:
 			name, value = item[0], item[1]
 			ok = 1
 			if value[0] in '-0123456789':
 				value = eval(value)
-			elif value[0] = '"':
+			elif value[0] == '"':
 				value = value[1:-1]
-			elif value = 'move-then-resize':
+			elif value == 'move-then-resize':
 				# Strange default set by Panel Editor...
 				ok = 0
 			else:
@@ -148,7 +148,7 @@
 	else:
 		actuatorname = ''
 	type = descr[0]
-	if type[:4] = 'pnl_': type = type[4:]
+	if type[:4] == 'pnl_': type = type[4:]
 	act = pnl.mkact(type)
 	act.downfunc = act.activefunc = act.upfunc = dummy_callback
 	#
@@ -158,9 +158,9 @@
 	#
 	datalist = getattrlist(descr, 'data')
 	prefix = ''
-	if type[-4:] = 'puck':
+	if type[-4:] == 'puck':
 		prefix = 'puck_'
-	elif type = 'mouse':
+	elif type == 'mouse':
 		prefix = 'mouse_'
 	assign_members(act, datalist, [], prefix)
 	#
diff --git a/Lib/irix5/panelparser.py b/Lib/irix5/panelparser.py
index 9c9ee02..1b069fa 100755
--- a/Lib/irix5/panelparser.py
+++ b/Lib/irix5/panelparser.py
@@ -20,16 +20,16 @@
 		c = s[:1]
 		if c in whitespace:
 			s = s[1:]
-		elif c = ';':
+		elif c == ';':
 			s = ''
-		elif c = '"':
+		elif c == '"':
 			n = len(s)
 			i = 1
 			while i < n:
 				c = s[i]
 				i = i+1
-				if c = '"': break
-				if c = '\\': i = i+1
+				if c == '"': break
+				if c == '\\': i = i+1
 			tokens.append(s[:i])
 			s = s[i:]
 		elif c in operators:
@@ -78,9 +78,9 @@
 	while 1:
 		if not tokens:
 			raise syntax_error, 'missing ")"'
-		if tokens[0] = ')':
+		if tokens[0] == ')':
 			return expr, tokens[1:]
-		elif tokens[0] = '(':
+		elif tokens[0] == '(':
 			subexpr, tokens = parse_expr(tokens)
 			expr.append(subexpr)
 		else:
diff --git a/Lib/lib-old/dump.py b/Lib/lib-old/dump.py
index cecc275..ec895b7 100644
--- a/Lib/lib-old/dump.py
+++ b/Lib/lib-old/dump.py
@@ -31,7 +31,7 @@
 def dumpvar(name, x):
 	import sys
 	t = type(x)
-	if t = type({}):
+	if t == type({}):
 		print name, '= {}'
 		for key in x.keys():
 			item = x[key]
@@ -42,7 +42,7 @@
 		if not printable(x):
 			print '#',
 		print name, '=', `x`
-	elif t = type(sys):
+	elif t == type(sys):
 		print 'import', name, '#', x
 	else:
 		print '#', name, '=', x
@@ -58,6 +58,6 @@
 			if not printable(item):
 				return 0
 		return 1
-	if x = {}:
+	if x == {}:
 		return 1
 	return 0
diff --git a/Lib/lib-old/grep.py b/Lib/lib-old/grep.py
index bfee3f5..21ef8d8 100644
--- a/Lib/lib-old/grep.py
+++ b/Lib/lib-old/grep.py
@@ -30,7 +30,7 @@
 			prefix = string.rjust(`lineno`, 3) + ': '
 			print prefix + line
 			if 0: # XXX
-				start, end = prog.regs()[0]
+				start, end = prog.regs[0]
 				line = line[:start]
 				if '\t' not in line:
 					prefix = ' ' * (len(prefix) + start)
diff --git a/Lib/lib-old/newdir.py b/Lib/lib-old/newdir.py
index 9d07d6c..4994bf9 100644
--- a/Lib/lib-old/newdir.py
+++ b/Lib/lib-old/newdir.py
@@ -53,7 +53,7 @@
 	return total
 	i = 0
 	while i+1 < len(total):
-		if total[i] = total[i+1]:
+		if total[i] == total[i+1]:
 			del total[i+1]
 		else:
 			i = i+1
@@ -62,7 +62,7 @@
 # Helper to recognize functions
 #
 def is_function(x):
-	return type(x) = type(is_function)
+	return type(x) == type(is_function)
 
 # Approximation of builtin dir(); this lists the user's
 # variables by default, not the current local name space.
@@ -71,7 +71,7 @@
 #
 class _dirclass:
 	def dir(args):
-		if type(args) = type(()):
+		if type(args) == type(()):
 			return listattrs(args[1])
 		else:
 			import __main__
diff --git a/Lib/lib-old/tb.py b/Lib/lib-old/tb.py
index ec63104..ef0c4b5 100644
--- a/Lib/lib-old/tb.py
+++ b/Lib/lib-old/tb.py
@@ -40,19 +40,19 @@
 			break
 		cmd = string.strip(line)
 		if cmd:
-			if cmd = 'quit':
+			if cmd == 'quit':
 				break
-			elif cmd = 'list':
+			elif cmd == 'list':
 				browserlist(tb)
-			elif cmd = 'up':
+			elif cmd == 'up':
 				if ptr-1 >= 0: ptr = ptr-1
 				else: print 'Bottom of stack.'
-			elif cmd = 'down':
+			elif cmd == 'down':
 				if ptr+1 < len(tblist): ptr = ptr+1
 				else: print 'Top of stack.'
-			elif cmd = 'locals':
+			elif cmd == 'locals':
 				printsymbols(tb.tb_frame.f_locals)
-			elif cmd = 'globals':
+			elif cmd == 'globals':
 				printsymbols(tb.tb_frame.f_globals)
 			elif cmd in ('?', 'help'):
 				browserhelp()
@@ -65,10 +65,10 @@
 	last = lineno
 	first = max(1, last-10)
 	for i in range(first, last+1):
-		if i = lineno: prefix = '***' + string.rjust(`i`, 4) + ':'
+		if i == lineno: prefix = '***' + string.rjust(`i`, 4) + ':'
 		else: prefix = string.rjust(`i`, 7) + ':'
 		line = readfileline(filename, i)
-		if line[-1:] = '\n': line = line[:-1]
+		if line[-1:] == '\n': line = line[:-1]
 		print prefix + line
 
 def browserexec(tb, cmd):
@@ -126,24 +126,24 @@
 		print
 
 def printobject(v, maxlevel):
-	if v = None:
+	if v == None:
 		print 'None',
 	elif type(v) in (type(0), type(0.0)):
 		print v,
-	elif type(v) = type(''):
+	elif type(v) == type(''):
 		if len(v) > 20:
 			print `v[:17] + '...'`,
 		else:
 			print `v`,
-	elif type(v) = type(()):
+	elif type(v) == type(()):
 		print '(',
 		printlist(v, maxlevel)
 		print ')',
-	elif type(v) = type([]):
+	elif type(v) == type([]):
 		print '[',
 		printlist(v, maxlevel)
 		print ']',
-	elif type(v) = type({}):
+	elif type(v) == type({}):
 		print '{',
 		printdict(v, maxlevel)
 		print '}',
@@ -152,7 +152,7 @@
 
 def printlist(v, maxlevel):
 	n = len(v)
-	if n = 0: return
+	if n == 0: return
 	if maxlevel <= 0:
 		print '...',
 		return
@@ -164,7 +164,7 @@
 def printdict(v, maxlevel):
 	keys = v.keys()
 	n = len(keys)
-	if n = 0: return
+	if n == 0: return
 	if maxlevel <= 0:
 		print '...',
 		return
@@ -187,8 +187,8 @@
 	cache_ok = 0
 	if _filecache.has_key(filename):
 		cached_stat, lines = _filecache[filename]
-		if stat[ST_SIZE] = cached_stat[ST_SIZE] and \
-				stat[ST_MTIME] = cached_stat[ST_MTIME]:
+		if stat[ST_SIZE] == cached_stat[ST_SIZE] and \
+				stat[ST_MTIME] == cached_stat[ST_MTIME]:
 			cache_ok = 1
 		else:
 			print 'Stale cache entry for', filename
diff --git a/Lib/lib-stdwin/Buttons.py b/Lib/lib-stdwin/Buttons.py
index 949e128..d1435d3 100644
--- a/Lib/lib-stdwin/Buttons.py
+++ b/Lib/lib-stdwin/Buttons.py
@@ -110,7 +110,7 @@
 	#
 	def draw(self, (d, area)):
 		area = _rect.intersect(area, self.bounds)
-		if area = _rect.empty:
+		if area == _rect.empty:
 			return
 		d.cliprect(area)
 		self.drawit(d)
diff --git a/Lib/lib-stdwin/CSplit.py b/Lib/lib-stdwin/CSplit.py
index 5c57d90..90d137e 100644
--- a/Lib/lib-stdwin/CSplit.py
+++ b/Lib/lib-stdwin/CSplit.py
@@ -43,7 +43,7 @@
 		# XXX One day Python will have automatic conversions...
 		n = len(self.children)
 		fn = float(n)
-		if n = 0: return
+		if n == 0: return
 		(left, top), (right, bottom) = bounds
 		width, height = right-left, bottom-top
 		child_width, child_height = width*3/(n+4), height*3/(n+4)
diff --git a/Lib/lib-stdwin/DirList.py b/Lib/lib-stdwin/DirList.py
index 20a0fe8..0066c58 100644
--- a/Lib/lib-stdwin/DirList.py
+++ b/Lib/lib-stdwin/DirList.py
@@ -25,7 +25,7 @@
 			if path.isdir(path.join(dirname, name)):
 				fullname = path.join(dirname, name)
 				btn = SubdirButton().definetext(self, fullname)
-			elif name[-3:] = '.py':
+			elif name[-3:] == '.py':
 				btn = ModuleButton().definetext(self, name)
 			else:
 				btn = FileButton().definetext(self, name)
diff --git a/Lib/lib-stdwin/Split.py b/Lib/lib-stdwin/Split.py
index b169d72..aacfa98 100644
--- a/Lib/lib-stdwin/Split.py
+++ b/Lib/lib-stdwin/Split.py
@@ -116,7 +116,7 @@
 		if not self.keybd_focus:
 			self.set_keybd_focus(self.keybd_interest[0])
 		type, detail = type_detail
-		if type = WE_COMMAND and detail = WC_TAB and \
+		if type == WE_COMMAND and detail == WC_TAB and \
 					len(self.keybd_interest) > 1:
 			self.next_keybd_focus()
 			return
@@ -144,9 +144,9 @@
 			self.timer_interest.remove(child)
 		if child in self.altdraw_interest:
 			self.altdraw_interest.remove(child)
-		if child = self.mouse_focus:
+		if child == self.mouse_focus:
 			self.mouse_focus = None
-		if child = self.keybd_focus:
+		if child == self.keybd_focus:
 			self.keybd_focus = None
 	#
 	def need_mouse(self, child):
@@ -154,7 +154,7 @@
 			self.mouse_interest.append(child)
 			self.parent.need_mouse(self)
 	def no_mouse(self, child):
-		if child = self.mouse_focus:
+		if child == self.mouse_focus:
 			self.mouse_focus = None
 		if child in self.mouse_interest:
 			self.mouse_interest.remove(child)
@@ -168,7 +168,7 @@
 		if not self.keybd_focus:
 			self.set_keybd_focus(child)
 	def no_keybd(self, child):
-		if child = self.keybd_focus:
+		if child == self.keybd_focus:
 			self.keybd_focus = None # Don't call child.deactivate()
 		if child in self.keybd_interest:
 			self.keybd_interest.remove(child)
diff --git a/Lib/lib-stdwin/StripChart.py b/Lib/lib-stdwin/StripChart.py
index d58f835..5bce412 100644
--- a/Lib/lib-stdwin/StripChart.py
+++ b/Lib/lib-stdwin/StripChart.py
@@ -51,7 +51,7 @@
 	#
 	def draw(self, (d, area)):
 		area = rect.intersect(area, self.bounds)
-		if area = rect.empty:
+		if area == rect.empty:
 			return
 		d.cliprect(area)
 		d.erase(self.bounds)
diff --git a/Lib/lib-stdwin/WindowParent.py b/Lib/lib-stdwin/WindowParent.py
index a0593c5..697ed07 100644
--- a/Lib/lib-stdwin/WindowParent.py
+++ b/Lib/lib-stdwin/WindowParent.py
@@ -149,26 +149,26 @@
 	# Only call dispatch once we are realized
 	#
 	def dispatch(self, (type, win, detail)):
-		if type = WE_DRAW:
+		if type == WE_DRAW:
 			d = self.win.begindrawing()
 			self.child.draw(d, detail)
 			del d
 			if self.do_altdraw: self.child.altdraw(detail)
-		elif type = WE_MOUSE_DOWN:
+		elif type == WE_MOUSE_DOWN:
 			if self.do_mouse: self.child.mouse_down(detail)
-		elif type = WE_MOUSE_MOVE:
+		elif type == WE_MOUSE_MOVE:
 			if self.do_mouse: self.child.mouse_move(detail)
-		elif type = WE_MOUSE_UP:
+		elif type == WE_MOUSE_UP:
 			if self.do_mouse: self.child.mouse_up(detail)
 		elif type in (WE_CHAR, WE_COMMAND):
 			if self.do_keybd: self.child.keybd(type, detail)
-		elif type = WE_TIMER:
+		elif type == WE_TIMER:
 			if self.do_timer: self.child.timer()
-		elif type = WE_SIZE:
+		elif type == WE_SIZE:
 			self.fixup()
-		elif type = WE_CLOSE:
+		elif type == WE_CLOSE:
 			self.close_trigger()
-		elif type = WE_MENU:
+		elif type == WE_MENU:
 			self.menu_trigger(detail)
 		if self.pending_destroy:
 			self.destroy()
diff --git a/Lib/lib-stdwin/WindowSched.py b/Lib/lib-stdwin/WindowSched.py
index 9125317..67c3afb 100644
--- a/Lib/lib-stdwin/WindowSched.py
+++ b/Lib/lib-stdwin/WindowSched.py
@@ -21,7 +21,7 @@
 	#
 	# Use millisleep for very short delays or if there are no windows
 	#
-	if msecs < 100 or mainloop.countwindows() = 0:
+	if msecs < 100 or mainloop.countwindows() == 0:
 		if msecs > 0:
 			time.millisleep(msecs)
 		return
@@ -46,7 +46,7 @@
 # Emptiness check must check both queues
 #
 def empty():
-	return q.empty() and mainloop.countwindows() = 0
+	return q.empty() and mainloop.countwindows() == 0
 
 # Run until there is nothing left to do
 #
diff --git a/Lib/lib-stdwin/dirwin.py b/Lib/lib-stdwin/dirwin.py
index d0a8525..beb5222 100644
--- a/Lib/lib-stdwin/dirwin.py
+++ b/Lib/lib-stdwin/dirwin.py
@@ -10,7 +10,7 @@
 
 def action(w, string, i, detail):
 	(h, v), clicks, button, mask = detail
-	if clicks = 2:
+	if clicks == 2:
 		name = path.join(w.name, string)
 		try:
 			w2 = anywin.open(name)
diff --git a/Lib/lib-stdwin/formatter.py b/Lib/lib-stdwin/formatter.py
index aea7deb..b2d4add 100644
--- a/Lib/lib-stdwin/formatter.py
+++ b/Lib/lib-stdwin/formatter.py
@@ -175,20 +175,20 @@
 	winsize = w.getwinsize()
 	while 1:
 		type, window, detail = stdwinq.getevent()
-		if type = WE_CLOSE:
+		if type == WE_CLOSE:
 			break
-		elif type = WE_SIZE:
+		elif type == WE_SIZE:
 			newsize = w.getwinsize()
 			if newsize <> winsize:
 				w.change((0,0), winsize)
 				winsize = newsize
 				w.change((0,0), winsize)
-		elif type = WE_MOUSE_DOWN:
+		elif type == WE_MOUSE_DOWN:
 			stage = (stage + 1) % len(stages)
 			justify, center, title = stages[stage]
 			w.settitle(title)
 			w.change((0, 0), (1000, 1000))
-		elif type = WE_DRAW:
+		elif type == WE_DRAW:
 			width, height = winsize
 			f = formatter().init(w.begindrawing(), 0, 0, width)
 			f.center = center
@@ -198,7 +198,7 @@
 			for font in font1, font2, font1:
 				f.setfont(font)
 				for word in words:
-					space = 1 + (word[-1:] = '.')
+					space = 1 + (word[-1:] == '.')
 					f.addword(word, space)
 					if center and space > 1:
 						f.flush()
diff --git a/Lib/lib-stdwin/gwin.py b/Lib/lib-stdwin/gwin.py
index c2ec11f..12ed90b 100644
--- a/Lib/lib-stdwin/gwin.py
+++ b/Lib/lib-stdwin/gwin.py
@@ -49,44 +49,44 @@
 
 def treatevent(e):			# Handle a stdwin event
 	type, w, detail = e
-	if type = WE_DRAW:
+	if type == WE_DRAW:
 		w.draw(w, detail)
-	elif type = WE_MENU:
+	elif type == WE_MENU:
 		m, item = detail
 		m.action[item](w, m, item)
-	elif type = WE_COMMAND:
+	elif type == WE_COMMAND:
 		treatcommand(w, detail)
-	elif type = WE_CHAR:
+	elif type == WE_CHAR:
 		w.char(w, detail)
-	elif type = WE_MOUSE_DOWN:
+	elif type == WE_MOUSE_DOWN:
 		if detail[1] > 1: w.m2down(w, detail)
 		else: w.mdown(w, detail)
-	elif type = WE_MOUSE_MOVE:
+	elif type == WE_MOUSE_MOVE:
 		w.mmove(w, detail)
-	elif type = WE_MOUSE_UP:
+	elif type == WE_MOUSE_UP:
 		if detail[1] > 1: w.m2up(w, detail)
 		else: w.mup(w, detail)
-	elif type = WE_SIZE:
+	elif type == WE_SIZE:
 		w.size(w, w.getwinsize())
-	elif type = WE_ACTIVATE:
+	elif type == WE_ACTIVATE:
 		w.activate(w)
-	elif type = WE_DEACTIVATE:
+	elif type == WE_DEACTIVATE:
 		w.deactivate(w)
-	elif type = WE_MOVE:
+	elif type == WE_MOVE:
 		w.move(w)
-	elif type = WE_TIMER:
+	elif type == WE_TIMER:
 		w.timer(w)
-	elif type = WE_CLOSE:
+	elif type == WE_CLOSE:
 		w.close(w)
 
 def treatcommand(w, type):		# Handle a we_command event
-	if type = WC_CLOSE:
+	if type == WC_CLOSE:
 		w.close(w)
-	elif type = WC_RETURN:
+	elif type == WC_RETURN:
 		w.enter(w)
-	elif type = WC_TAB:
+	elif type == WC_TAB:
 		w.tab(w)
-	elif type = WC_BACKSPACE:
+	elif type == WC_BACKSPACE:
 		w.backspace(w)
 	elif type in (WC_LEFT, WC_UP, WC_RIGHT, WC_DOWN):
 		w.arrow(w, type)
@@ -101,13 +101,13 @@
 			break
 
 def arrow(w, detail):			# Arrow key method
-	if detail = WC_LEFT:
+	if detail == WC_LEFT:
 		w.kleft(w)
-	elif detail = WC_UP:
+	elif detail == WC_UP:
 		w.kup(w)
-	elif detail = WC_RIGHT:
+	elif detail == WC_RIGHT:
 		w.kright(w)
-	elif detail = WC_DOWN:
+	elif detail == WC_DOWN:
 		w.kdown(w)
 
 
diff --git a/Lib/lib-stdwin/tablewin.py b/Lib/lib-stdwin/tablewin.py
index f9ab907..eba161d 100644
--- a/Lib/lib-stdwin/tablewin.py
+++ b/Lib/lib-stdwin/tablewin.py
@@ -164,13 +164,13 @@
 	return len(w.data)
 
 def arrow(w, type):
-	if type = WC_LEFT:
+	if type == WC_LEFT:
 		incr = -1, 0
-	elif type = WC_UP:
+	elif type == WC_UP:
 		incr = 0, -1
-	elif type = WC_RIGHT:
+	elif type == WC_RIGHT:
 		incr = 1, 0
-	elif type = WC_DOWN:
+	elif type == WC_DOWN:
 		incr = 0, 1
 	else:
 		return
diff --git a/Lib/macpath.py b/Lib/macpath.py
index 58cbb88..533b052 100644
--- a/Lib/macpath.py
+++ b/Lib/macpath.py
@@ -21,7 +21,7 @@
 
 def join(s, t):
 	if (not s) or isabs(t): return t
-	if t[:1] = ':': t = t[1:]
+	if t[:1] == ':': t = t[1:]
 	if ':' not in s:
 		s = ':' + s
 	if s[-1:] <> ':':
@@ -40,7 +40,7 @@
 	if ':' not in s: return '', s
 	colon = 0
 	for i in range(len(s)):
-		if s[i] = ':': colon = i+1
+		if s[i] == ':': colon = i+1
 	return s[:colon], s[colon:]
 
 
diff --git a/Lib/newdir.py b/Lib/newdir.py
index 9d07d6c..4994bf9 100644
--- a/Lib/newdir.py
+++ b/Lib/newdir.py
@@ -53,7 +53,7 @@
 	return total
 	i = 0
 	while i+1 < len(total):
-		if total[i] = total[i+1]:
+		if total[i] == total[i+1]:
 			del total[i+1]
 		else:
 			i = i+1
@@ -62,7 +62,7 @@
 # Helper to recognize functions
 #
 def is_function(x):
-	return type(x) = type(is_function)
+	return type(x) == type(is_function)
 
 # Approximation of builtin dir(); this lists the user's
 # variables by default, not the current local name space.
@@ -71,7 +71,7 @@
 #
 class _dirclass:
 	def dir(args):
-		if type(args) = type(()):
+		if type(args) == type(()):
 			return listattrs(args[1])
 		else:
 			import __main__
diff --git a/Lib/persist.py b/Lib/persist.py
index 065a3ea..52cc6fb 100755
--- a/Lib/persist.py
+++ b/Lib/persist.py
@@ -160,23 +160,23 @@
 	typedict[xrepr] = uid
 	if typeswitch.has_key(xrepr):
 		print FN, '[', `uid`, '] =', typeswitch[xrepr]
-	elif x = type(sys):
+	elif x == type(sys):
 		print 'import sys'
 		print FN, '[', `uid`, '] = type(sys)'
-	elif x = type(sys.stderr):
+	elif x == type(sys.stderr):
 		print 'import sys'
 		print FN, '[', `uid`, '] = type(sys.stderr)'
-	elif x = type(dumptype):
+	elif x == type(dumptype):
 		print 'def some_function(): pass'
 		print FN, '[', `uid`, '] = type(some_function)'
-	elif x = type(some_class):
+	elif x == type(some_class):
 		print 'class some_class(): pass'
 		print FN, '[', `uid`, '] = type(some_class)'
-	elif x = type(some_instance):
+	elif x == type(some_instance):
 		print 'class another_class(): pass'
 		print 'some_instance = another_class()'
 		print FN, '[', `uid`, '] = type(some_instance)'
-	elif x = type(some_instance.method):
+	elif x == type(some_instance.method):
 		print 'class yet_another_class():'
 		print '    def method(): pass'
 		print 'another_instance = yet_another_class()'
diff --git a/Lib/plat-irix5/flp.py b/Lib/plat-irix5/flp.py
index 71a8f66..dfbad01 100755
--- a/Lib/plat-irix5/flp.py
+++ b/Lib/plat-irix5/flp.py
@@ -49,7 +49,7 @@
 def _open_formfile(filename):
     if filename[-3:] <> '.fd':
 	filename = filename + '.fd'
-    if filename[0] = '/':
+    if filename[0] == '/':
 	try:
 	    fp = open(filename,'r')
 	except IOError:
@@ -62,7 +62,7 @@
 		break
 	    except IOError:
 		fp = None
-    if fp = None:
+    if fp == None:
 	raise error, 'Cannot find forms file ' + filename
     return fp
 
@@ -77,7 +77,7 @@
     # Now skip until we know number of forms
     while 1:
 	datum = _parse_1_line(file)
-	if type(datum) = type(()) and datum[0] = 'Numberofforms':
+	if type(datum) == type(()) and datum[0] == 'Numberofforms':
 	    break
     return datum[1]
 #
@@ -89,7 +89,7 @@
     if datum <> FORMLINE:
 	raise error, 'Missing === FORM === line'
     form = _parse_object(file)
-    if form.Name = name or name = None:
+    if form.Name == name or name == None:
 	objs = []
 	for j in range(form.Numberofobjects):
 	    obj = _parse_object(file)
@@ -147,7 +147,7 @@
     if not a:
 	return line
     name = line[:a[1][1]]
-    if name[0] = 'N':
+    if name[0] == 'N':
 	    name = string.joinfields(string.split(name),'')
 	    name = string.lower(name)
     name = string.upper(name[0]) + name[1:]
@@ -167,7 +167,7 @@
 	
 def _parse_1_line(file):
     line = _readline(file)
-    while line = '':
+    while line == '':
 	line = _readline(file)
     return _parse_line(line)
 
@@ -176,7 +176,7 @@
     while not line in (SPLITLINE, FORMLINE, ENDLINE):
 	pos = file.tell()
 	line = _readline(file)
-    if line = FORMLINE:
+    if line == FORMLINE:
 	file.seek(pos)
 
 def _parse_object(file):
@@ -185,7 +185,7 @@
 	pos = file.tell()
 	datum = _parse_1_line(file)
 	if datum in (SPLITLINE, FORMLINE, ENDLINE):
-	    if datum = FORMLINE:
+	    if datum == FORMLINE:
 		file.seek(pos)
 	    return obj
 	if type(datum) <> type(()):
@@ -266,27 +266,27 @@
 # Internal crfunc: helper function that returns correct create function
 #
 def _select_crfunc(fm, cl):
-    if cl = FL.BEGIN_GROUP: return fm.bgn_group
-    elif cl = FL.END_GROUP: return fm.end_group
-    elif cl = FL.BITMAP: return fm.add_bitmap
-    elif cl = FL.BOX: return fm.add_box
-    elif cl = FL.BROWSER: return fm.add_browser
-    elif cl = FL.BUTTON: return fm.add_button
-    elif cl = FL.CHART: return fm.add_chart
-    elif cl = FL.CHOICE: return fm.add_choice
-    elif cl = FL.CLOCK: return fm.add_clock
-    elif cl = FL.COUNTER: return fm.add_counter
-    elif cl = FL.DIAL: return fm.add_dial
-    elif cl = FL.FREE: return fm.add_free
-    elif cl = FL.INPUT: return fm.add_input
-    elif cl = FL.LIGHTBUTTON: return fm.add_lightbutton
-    elif cl = FL.MENU: return fm.add_menu
-    elif cl = FL.POSITIONER: return fm.add_positioner
-    elif cl = FL.ROUNDBUTTON: return fm.add_roundbutton
-    elif cl = FL.SLIDER: return fm.add_slider
-    elif cl = FL.VALSLIDER: return fm.add_valslider
-    elif cl = FL.TEXT: return fm.add_text
-    elif cl = FL.TIMER: return fm.add_timer
+    if cl == FL.BEGIN_GROUP: return fm.bgn_group
+    elif cl == FL.END_GROUP: return fm.end_group
+    elif cl == FL.BITMAP: return fm.add_bitmap
+    elif cl == FL.BOX: return fm.add_box
+    elif cl == FL.BROWSER: return fm.add_browser
+    elif cl == FL.BUTTON: return fm.add_button
+    elif cl == FL.CHART: return fm.add_chart
+    elif cl == FL.CHOICE: return fm.add_choice
+    elif cl == FL.CLOCK: return fm.add_clock
+    elif cl == FL.COUNTER: return fm.add_counter
+    elif cl == FL.DIAL: return fm.add_dial
+    elif cl == FL.FREE: return fm.add_free
+    elif cl == FL.INPUT: return fm.add_input
+    elif cl == FL.LIGHTBUTTON: return fm.add_lightbutton
+    elif cl == FL.MENU: return fm.add_menu
+    elif cl == FL.POSITIONER: return fm.add_positioner
+    elif cl == FL.ROUNDBUTTON: return fm.add_roundbutton
+    elif cl == FL.SLIDER: return fm.add_slider
+    elif cl == FL.VALSLIDER: return fm.add_valslider
+    elif cl == FL.TEXT: return fm.add_text
+    elif cl == FL.TIMER: return fm.add_timer
     else:
 	raise error, 'Unknown object type: ' + `cl`
 
diff --git a/Lib/plat-irix5/panel.py b/Lib/plat-irix5/panel.py
index 9fda1c6..21a17ba 100755
--- a/Lib/plat-irix5/panel.py
+++ b/Lib/plat-irix5/panel.py
@@ -17,7 +17,7 @@
 # Test if an object is a list.
 #
 def is_list(x):
-	return type(x) = type([])
+	return type(x) == type([])
 
 
 # Reverse a list.
@@ -34,7 +34,7 @@
 #
 def getattrlist(list, name):
 	for item in list:
-		if item and is_list(item) and item[0] = name:
+		if item and is_list(item) and item[0] == name:
 			return item[1:]
 	return []
 
@@ -43,8 +43,8 @@
 #
 def getproplist(list, name):
 	for item in list:
-		if item and is_list(item) and item[0] = 'prop':
-			if len(item) > 1 and item[1] = name:
+		if item and is_list(item) and item[0] == 'prop':
+			if len(item) > 1 and item[1] == name:
 				return item[2:]
 	return []
 
@@ -53,7 +53,7 @@
 #
 def is_endgroup(list):
 	x = getproplist(list, 'end-of-group')
-	return (x and x[0] = '#t')
+	return (x and x[0] == '#t')
 
 
 # Neatly display an actuator definition given as S-expression
@@ -63,13 +63,13 @@
 	for item in a:
 		if not is_list(item):
 			print prefix, item
-		elif item and item[0] = 'al':
+		elif item and item[0] == 'al':
 			print prefix, 'Subactuator list:'
 			for a in item[1:]:
 				show_actuator(prefix + '    ', a)
-		elif len(item) = 2:
+		elif len(item) == 2:
 			print prefix, item[0], '=>', item[1]
-		elif len(item) = 3 and item[0] = 'prop':
+		elif len(item) == 3 and item[0] == 'prop':
 			print prefix, 'Prop', item[1], '=>',
 			print item[2]
 		else:
@@ -82,13 +82,13 @@
 	for item in p:
 		if not is_list(item):
 			print prefix, item
-		elif item and item[0] = 'al':
+		elif item and item[0] == 'al':
 			print prefix, 'Actuator list:'
 			for a in item[1:]:
 				show_actuator(prefix + '    ', a)
-		elif len(item) = 2:
+		elif len(item) == 2:
 			print prefix, item[0], '=>', item[1]
-		elif len(item) = 3 and item[0] = 'prop':
+		elif len(item) == 3 and item[0] == 'prop':
 			print prefix, 'Prop', item[1], '=>',
 			print item[2]
 		else:
@@ -112,14 +112,14 @@
 #
 def assign_members(target, attrlist, exclist, prefix):
 	for item in attrlist:
-		if is_list(item) and len(item) = 2 and item[0] not in exclist:
+		if is_list(item) and len(item) == 2 and item[0] not in exclist:
 			name, value = item[0], item[1]
 			ok = 1
 			if value[0] in '-0123456789':
 				value = eval(value)
-			elif value[0] = '"':
+			elif value[0] == '"':
 				value = value[1:-1]
-			elif value = 'move-then-resize':
+			elif value == 'move-then-resize':
 				# Strange default set by Panel Editor...
 				ok = 0
 			else:
@@ -148,7 +148,7 @@
 	else:
 		actuatorname = ''
 	type = descr[0]
-	if type[:4] = 'pnl_': type = type[4:]
+	if type[:4] == 'pnl_': type = type[4:]
 	act = pnl.mkact(type)
 	act.downfunc = act.activefunc = act.upfunc = dummy_callback
 	#
@@ -158,9 +158,9 @@
 	#
 	datalist = getattrlist(descr, 'data')
 	prefix = ''
-	if type[-4:] = 'puck':
+	if type[-4:] == 'puck':
 		prefix = 'puck_'
-	elif type = 'mouse':
+	elif type == 'mouse':
 		prefix = 'mouse_'
 	assign_members(act, datalist, [], prefix)
 	#
diff --git a/Lib/plat-irix5/panelparser.py b/Lib/plat-irix5/panelparser.py
index 9c9ee02..1b069fa 100755
--- a/Lib/plat-irix5/panelparser.py
+++ b/Lib/plat-irix5/panelparser.py
@@ -20,16 +20,16 @@
 		c = s[:1]
 		if c in whitespace:
 			s = s[1:]
-		elif c = ';':
+		elif c == ';':
 			s = ''
-		elif c = '"':
+		elif c == '"':
 			n = len(s)
 			i = 1
 			while i < n:
 				c = s[i]
 				i = i+1
-				if c = '"': break
-				if c = '\\': i = i+1
+				if c == '"': break
+				if c == '\\': i = i+1
 			tokens.append(s[:i])
 			s = s[i:]
 		elif c in operators:
@@ -78,9 +78,9 @@
 	while 1:
 		if not tokens:
 			raise syntax_error, 'missing ")"'
-		if tokens[0] = ')':
+		if tokens[0] == ')':
 			return expr, tokens[1:]
-		elif tokens[0] = '(':
+		elif tokens[0] == '(':
 			subexpr, tokens = parse_expr(tokens)
 			expr.append(subexpr)
 		else:
diff --git a/Lib/poly.py b/Lib/poly.py
index abac4c8..3a21904 100644
--- a/Lib/poly.py
+++ b/Lib/poly.py
@@ -39,9 +39,9 @@
 	return res
 
 def power(a, n): # Raise polynomial a to the positive integral power n
-	if n = 0: return [1]
-	if n = 1: return a
-	if n/2*2 = n:
+	if n == 0: return [1]
+	if n == 1: return a
+	if n/2*2 == n:
 		b = power(a, n/2)
 		return times(b, b)
 	return times(power(a, n-1), a)
diff --git a/Lib/posixpath.py b/Lib/posixpath.py
index 9a2ccb0..fa72ecb 100644
--- a/Lib/posixpath.py
+++ b/Lib/posixpath.py
@@ -10,8 +10,8 @@
 # (begins with '/').
 #
 def join(a, b):
-	if b[:1] = '/': return b
-	if a = '' or a[-1:] = '/': return a + b
+	if b[:1] == '/': return b
+	if a == '' or a[-1:] == '/': return a + b
 	# Note: join('x', '') returns 'x/'; is this what we want?
 	return a + '/' + b
 
@@ -27,7 +27,7 @@
 	head, tail = '', ''
 	for c in p:
 		tail = tail + c
-		if c = '/':
+		if c == '/':
 			head, tail = head + tail, ''
 	return head, tail
 
@@ -40,9 +40,9 @@
 def splitext(p):
 	root, ext = '', ''
 	for c in p:
-		if c = '/':
+		if c == '/':
 			root, ext = root + ext + c, ''
-		elif c = '.' or ext:
+		elif c == '.' or ext:
 			ext = ext + c
 		else:
 			root = root + c
@@ -64,7 +64,7 @@
 		for i in range(len(prefix)):
 			if prefix[:i+1] <> item[:i+1]:
 				prefix = prefix[:i]
-				if i = 0: return ''
+				if i == 0: return ''
 				break
 	return prefix
 
@@ -122,8 +122,8 @@
 # describing the same file?
 #
 def samestat(s1, s2):
-	return s1[stat.ST_INO] = s2[stat.ST_INO] and \
-		s1[stat.ST_DEV] = s2[stat.STD_DEV]
+	return s1[stat.ST_INO] == s2[stat.ST_INO] and \
+		s1[stat.ST_DEV] == s2[stat.STD_DEV]
 
 
 # Subroutine and global data used by ismount().
@@ -137,7 +137,7 @@
 	lines = string.splitfields(data, '\n')
 	for line in lines:
 		words = string.split(line)
-		if len(words) >= 3 and words[1] = 'on':
+		if len(words) >= 3 and words[1] == 'on':
 			mounts.append(words[2])
 	return mounts
 
diff --git a/Lib/sched.py b/Lib/sched.py
index e7d2b87..4a45309 100644
--- a/Lib/sched.py
+++ b/Lib/sched.py
@@ -49,7 +49,7 @@
 		for i in range(len(q)):
 			qtime, qpri, qact, qarg = q[i]
 			if time < qtime: break
-			if time = qtime and priority < qpri: break
+			if time == qtime and priority < qpri: break
 		else:
 			i = len(q)
 		q.insert(i, event)
@@ -72,7 +72,7 @@
 	# Check whether the queue is empty.
 	#
 	def empty(self):
-		return len(self.queue) = 0
+		return len(self.queue) == 0
 	#
 	# Run: execute events until the queue is empty.
 	#
diff --git a/Lib/stat.py b/Lib/stat.py
index fee4965..3682b20 100644
--- a/Lib/stat.py
+++ b/Lib/stat.py
@@ -36,22 +36,22 @@
 S_IFSOCK = 0140000
 
 def S_ISDIR(mode):
-	return S_IFMT(mode) = S_IFDIR
+	return S_IFMT(mode) == S_IFDIR
 
 def S_ISCHR(mode):
-	return S_IFMT(mode) = S_IFCHR
+	return S_IFMT(mode) == S_IFCHR
 
 def S_ISBLK(mode):
-	return S_IFMT(mode) = S_IFBLK
+	return S_IFMT(mode) == S_IFBLK
 
 def S_ISREG(mode):
-	return S_IFMT(mode) = S_IFREG
+	return S_IFMT(mode) == S_IFREG
 
 def S_ISFIFO(mode):
-	return S_IFMT(mode) = S_IFIFO
+	return S_IFMT(mode) == S_IFIFO
 
 def S_ISLNK(mode):
-	return S_IFMT(mode) = S_IFLNK
+	return S_IFMT(mode) == S_IFLNK
 
 def S_ISSOCK(mode):
-	return S_IFMT(mode) = S_IFSOCK
+	return S_IFMT(mode) == S_IFSOCK
diff --git a/Lib/statcache.py b/Lib/statcache.py
index 36ecc96..bf13eb5 100644
--- a/Lib/statcache.py
+++ b/Lib/statcache.py
@@ -44,7 +44,7 @@
 def forget_prefix(prefix):
 	n = len(prefix)
 	for path in cache.keys():
-		if path[:n] = prefix:
+		if path[:n] == prefix:
 			del cache[path]
 
 
@@ -52,16 +52,16 @@
 # entries in subdirectories.
 #
 def forget_dir(prefix):
-	if prefix[-1:] = '/' and prefix <> '/':
+	if prefix[-1:] == '/' and prefix <> '/':
 		prefix = prefix[:-1]
 	forget(prefix)
 	if prefix[-1:] <> '/':
 		prefix = prefix + '/'
 	n = len(prefix)
 	for path in cache.keys():
-		if path[:n] = prefix:
+		if path[:n] == prefix:
 			rest = path[n:]
-			if rest[-1:] = '/': rest = rest[:-1]
+			if rest[-1:] == '/': rest = rest[:-1]
 			if '/' not in rest:
 				del cache[path]
 
diff --git a/Lib/stdwin/Buttons.py b/Lib/stdwin/Buttons.py
index 949e128..d1435d3 100755
--- a/Lib/stdwin/Buttons.py
+++ b/Lib/stdwin/Buttons.py
@@ -110,7 +110,7 @@
 	#
 	def draw(self, (d, area)):
 		area = _rect.intersect(area, self.bounds)
-		if area = _rect.empty:
+		if area == _rect.empty:
 			return
 		d.cliprect(area)
 		self.drawit(d)
diff --git a/Lib/stdwin/CSplit.py b/Lib/stdwin/CSplit.py
index 5c57d90..90d137e 100755
--- a/Lib/stdwin/CSplit.py
+++ b/Lib/stdwin/CSplit.py
@@ -43,7 +43,7 @@
 		# XXX One day Python will have automatic conversions...
 		n = len(self.children)
 		fn = float(n)
-		if n = 0: return
+		if n == 0: return
 		(left, top), (right, bottom) = bounds
 		width, height = right-left, bottom-top
 		child_width, child_height = width*3/(n+4), height*3/(n+4)
diff --git a/Lib/stdwin/DirList.py b/Lib/stdwin/DirList.py
index 20a0fe8..0066c58 100755
--- a/Lib/stdwin/DirList.py
+++ b/Lib/stdwin/DirList.py
@@ -25,7 +25,7 @@
 			if path.isdir(path.join(dirname, name)):
 				fullname = path.join(dirname, name)
 				btn = SubdirButton().definetext(self, fullname)
-			elif name[-3:] = '.py':
+			elif name[-3:] == '.py':
 				btn = ModuleButton().definetext(self, name)
 			else:
 				btn = FileButton().definetext(self, name)
diff --git a/Lib/stdwin/Split.py b/Lib/stdwin/Split.py
index b169d72..aacfa98 100755
--- a/Lib/stdwin/Split.py
+++ b/Lib/stdwin/Split.py
@@ -116,7 +116,7 @@
 		if not self.keybd_focus:
 			self.set_keybd_focus(self.keybd_interest[0])
 		type, detail = type_detail
-		if type = WE_COMMAND and detail = WC_TAB and \
+		if type == WE_COMMAND and detail == WC_TAB and \
 					len(self.keybd_interest) > 1:
 			self.next_keybd_focus()
 			return
@@ -144,9 +144,9 @@
 			self.timer_interest.remove(child)
 		if child in self.altdraw_interest:
 			self.altdraw_interest.remove(child)
-		if child = self.mouse_focus:
+		if child == self.mouse_focus:
 			self.mouse_focus = None
-		if child = self.keybd_focus:
+		if child == self.keybd_focus:
 			self.keybd_focus = None
 	#
 	def need_mouse(self, child):
@@ -154,7 +154,7 @@
 			self.mouse_interest.append(child)
 			self.parent.need_mouse(self)
 	def no_mouse(self, child):
-		if child = self.mouse_focus:
+		if child == self.mouse_focus:
 			self.mouse_focus = None
 		if child in self.mouse_interest:
 			self.mouse_interest.remove(child)
@@ -168,7 +168,7 @@
 		if not self.keybd_focus:
 			self.set_keybd_focus(child)
 	def no_keybd(self, child):
-		if child = self.keybd_focus:
+		if child == self.keybd_focus:
 			self.keybd_focus = None # Don't call child.deactivate()
 		if child in self.keybd_interest:
 			self.keybd_interest.remove(child)
diff --git a/Lib/stdwin/StripChart.py b/Lib/stdwin/StripChart.py
index d58f835..5bce412 100755
--- a/Lib/stdwin/StripChart.py
+++ b/Lib/stdwin/StripChart.py
@@ -51,7 +51,7 @@
 	#
 	def draw(self, (d, area)):
 		area = rect.intersect(area, self.bounds)
-		if area = rect.empty:
+		if area == rect.empty:
 			return
 		d.cliprect(area)
 		d.erase(self.bounds)
diff --git a/Lib/stdwin/WindowParent.py b/Lib/stdwin/WindowParent.py
index a0593c5..697ed07 100755
--- a/Lib/stdwin/WindowParent.py
+++ b/Lib/stdwin/WindowParent.py
@@ -149,26 +149,26 @@
 	# Only call dispatch once we are realized
 	#
 	def dispatch(self, (type, win, detail)):
-		if type = WE_DRAW:
+		if type == WE_DRAW:
 			d = self.win.begindrawing()
 			self.child.draw(d, detail)
 			del d
 			if self.do_altdraw: self.child.altdraw(detail)
-		elif type = WE_MOUSE_DOWN:
+		elif type == WE_MOUSE_DOWN:
 			if self.do_mouse: self.child.mouse_down(detail)
-		elif type = WE_MOUSE_MOVE:
+		elif type == WE_MOUSE_MOVE:
 			if self.do_mouse: self.child.mouse_move(detail)
-		elif type = WE_MOUSE_UP:
+		elif type == WE_MOUSE_UP:
 			if self.do_mouse: self.child.mouse_up(detail)
 		elif type in (WE_CHAR, WE_COMMAND):
 			if self.do_keybd: self.child.keybd(type, detail)
-		elif type = WE_TIMER:
+		elif type == WE_TIMER:
 			if self.do_timer: self.child.timer()
-		elif type = WE_SIZE:
+		elif type == WE_SIZE:
 			self.fixup()
-		elif type = WE_CLOSE:
+		elif type == WE_CLOSE:
 			self.close_trigger()
-		elif type = WE_MENU:
+		elif type == WE_MENU:
 			self.menu_trigger(detail)
 		if self.pending_destroy:
 			self.destroy()
diff --git a/Lib/stdwin/WindowSched.py b/Lib/stdwin/WindowSched.py
index 9125317..67c3afb 100755
--- a/Lib/stdwin/WindowSched.py
+++ b/Lib/stdwin/WindowSched.py
@@ -21,7 +21,7 @@
 	#
 	# Use millisleep for very short delays or if there are no windows
 	#
-	if msecs < 100 or mainloop.countwindows() = 0:
+	if msecs < 100 or mainloop.countwindows() == 0:
 		if msecs > 0:
 			time.millisleep(msecs)
 		return
@@ -46,7 +46,7 @@
 # Emptiness check must check both queues
 #
 def empty():
-	return q.empty() and mainloop.countwindows() = 0
+	return q.empty() and mainloop.countwindows() == 0
 
 # Run until there is nothing left to do
 #
diff --git a/Lib/stdwin/dirwin.py b/Lib/stdwin/dirwin.py
index d0a8525..beb5222 100755
--- a/Lib/stdwin/dirwin.py
+++ b/Lib/stdwin/dirwin.py
@@ -10,7 +10,7 @@
 
 def action(w, string, i, detail):
 	(h, v), clicks, button, mask = detail
-	if clicks = 2:
+	if clicks == 2:
 		name = path.join(w.name, string)
 		try:
 			w2 = anywin.open(name)
diff --git a/Lib/stdwin/formatter.py b/Lib/stdwin/formatter.py
index aea7deb..b2d4add 100755
--- a/Lib/stdwin/formatter.py
+++ b/Lib/stdwin/formatter.py
@@ -175,20 +175,20 @@
 	winsize = w.getwinsize()
 	while 1:
 		type, window, detail = stdwinq.getevent()
-		if type = WE_CLOSE:
+		if type == WE_CLOSE:
 			break
-		elif type = WE_SIZE:
+		elif type == WE_SIZE:
 			newsize = w.getwinsize()
 			if newsize <> winsize:
 				w.change((0,0), winsize)
 				winsize = newsize
 				w.change((0,0), winsize)
-		elif type = WE_MOUSE_DOWN:
+		elif type == WE_MOUSE_DOWN:
 			stage = (stage + 1) % len(stages)
 			justify, center, title = stages[stage]
 			w.settitle(title)
 			w.change((0, 0), (1000, 1000))
-		elif type = WE_DRAW:
+		elif type == WE_DRAW:
 			width, height = winsize
 			f = formatter().init(w.begindrawing(), 0, 0, width)
 			f.center = center
@@ -198,7 +198,7 @@
 			for font in font1, font2, font1:
 				f.setfont(font)
 				for word in words:
-					space = 1 + (word[-1:] = '.')
+					space = 1 + (word[-1:] == '.')
 					f.addword(word, space)
 					if center and space > 1:
 						f.flush()
diff --git a/Lib/stdwin/gwin.py b/Lib/stdwin/gwin.py
index c2ec11f..12ed90b 100755
--- a/Lib/stdwin/gwin.py
+++ b/Lib/stdwin/gwin.py
@@ -49,44 +49,44 @@
 
 def treatevent(e):			# Handle a stdwin event
 	type, w, detail = e
-	if type = WE_DRAW:
+	if type == WE_DRAW:
 		w.draw(w, detail)
-	elif type = WE_MENU:
+	elif type == WE_MENU:
 		m, item = detail
 		m.action[item](w, m, item)
-	elif type = WE_COMMAND:
+	elif type == WE_COMMAND:
 		treatcommand(w, detail)
-	elif type = WE_CHAR:
+	elif type == WE_CHAR:
 		w.char(w, detail)
-	elif type = WE_MOUSE_DOWN:
+	elif type == WE_MOUSE_DOWN:
 		if detail[1] > 1: w.m2down(w, detail)
 		else: w.mdown(w, detail)
-	elif type = WE_MOUSE_MOVE:
+	elif type == WE_MOUSE_MOVE:
 		w.mmove(w, detail)
-	elif type = WE_MOUSE_UP:
+	elif type == WE_MOUSE_UP:
 		if detail[1] > 1: w.m2up(w, detail)
 		else: w.mup(w, detail)
-	elif type = WE_SIZE:
+	elif type == WE_SIZE:
 		w.size(w, w.getwinsize())
-	elif type = WE_ACTIVATE:
+	elif type == WE_ACTIVATE:
 		w.activate(w)
-	elif type = WE_DEACTIVATE:
+	elif type == WE_DEACTIVATE:
 		w.deactivate(w)
-	elif type = WE_MOVE:
+	elif type == WE_MOVE:
 		w.move(w)
-	elif type = WE_TIMER:
+	elif type == WE_TIMER:
 		w.timer(w)
-	elif type = WE_CLOSE:
+	elif type == WE_CLOSE:
 		w.close(w)
 
 def treatcommand(w, type):		# Handle a we_command event
-	if type = WC_CLOSE:
+	if type == WC_CLOSE:
 		w.close(w)
-	elif type = WC_RETURN:
+	elif type == WC_RETURN:
 		w.enter(w)
-	elif type = WC_TAB:
+	elif type == WC_TAB:
 		w.tab(w)
-	elif type = WC_BACKSPACE:
+	elif type == WC_BACKSPACE:
 		w.backspace(w)
 	elif type in (WC_LEFT, WC_UP, WC_RIGHT, WC_DOWN):
 		w.arrow(w, type)
@@ -101,13 +101,13 @@
 			break
 
 def arrow(w, detail):			# Arrow key method
-	if detail = WC_LEFT:
+	if detail == WC_LEFT:
 		w.kleft(w)
-	elif detail = WC_UP:
+	elif detail == WC_UP:
 		w.kup(w)
-	elif detail = WC_RIGHT:
+	elif detail == WC_RIGHT:
 		w.kright(w)
-	elif detail = WC_DOWN:
+	elif detail == WC_DOWN:
 		w.kdown(w)
 
 
diff --git a/Lib/stdwin/tablewin.py b/Lib/stdwin/tablewin.py
index f9ab907..eba161d 100755
--- a/Lib/stdwin/tablewin.py
+++ b/Lib/stdwin/tablewin.py
@@ -164,13 +164,13 @@
 	return len(w.data)
 
 def arrow(w, type):
-	if type = WC_LEFT:
+	if type == WC_LEFT:
 		incr = -1, 0
-	elif type = WC_UP:
+	elif type == WC_UP:
 		incr = 0, -1
-	elif type = WC_RIGHT:
+	elif type == WC_RIGHT:
 		incr = 1, 0
-	elif type = WC_DOWN:
+	elif type == WC_DOWN:
 		incr = 0, 1
 	else:
 		return
diff --git a/Lib/string.py b/Lib/string.py
index 1c45ab3..1412048 100644
--- a/Lib/string.py
+++ b/Lib/string.py
@@ -56,7 +56,7 @@
 	i, n = 0, len(s)
 	while i < n:
 		while i < n and s[i] in whitespace: i = i+1
-		if i = n: break
+		if i == n: break
 		j = i
 		while j < n and s[j] not in whitespace: j = j+1
 		res.append(s[i:j])
@@ -71,7 +71,7 @@
 	nsep = len(sep)
 	i = j = 0
 	while j+nsep <= ns:
-		if s[j:j+nsep] = sep:
+		if s[j:j+nsep] == sep:
 			res.append(s[i:j])
 			i = j = j + nsep
 		else:
@@ -98,7 +98,7 @@
 def index(s, sub):
 	n = len(sub)
 	for i in range(len(s) + 1 - n):
-		if sub = s[i:i+n]: return i
+		if sub == s[i:i+n]: return i
 	raise index_error, (s, sub)
 
 # Convert string to integer
@@ -137,7 +137,7 @@
 # Decadent feature: the argument may be a string or a number
 # (Use of this is deprecated; it should be a string as with ljust c.s.)
 def zfill(x, width):
-	if type(x) = type(''): s = x
+	if type(x) == type(''): s = x
 	else: s = `x`
 	n = len(s)
 	if n >= width: return s
diff --git a/Lib/stringold.py b/Lib/stringold.py
index 1c45ab3..1412048 100644
--- a/Lib/stringold.py
+++ b/Lib/stringold.py
@@ -56,7 +56,7 @@
 	i, n = 0, len(s)
 	while i < n:
 		while i < n and s[i] in whitespace: i = i+1
-		if i = n: break
+		if i == n: break
 		j = i
 		while j < n and s[j] not in whitespace: j = j+1
 		res.append(s[i:j])
@@ -71,7 +71,7 @@
 	nsep = len(sep)
 	i = j = 0
 	while j+nsep <= ns:
-		if s[j:j+nsep] = sep:
+		if s[j:j+nsep] == sep:
 			res.append(s[i:j])
 			i = j = j + nsep
 		else:
@@ -98,7 +98,7 @@
 def index(s, sub):
 	n = len(sub)
 	for i in range(len(s) + 1 - n):
-		if sub = s[i:i+n]: return i
+		if sub == s[i:i+n]: return i
 	raise index_error, (s, sub)
 
 # Convert string to integer
@@ -137,7 +137,7 @@
 # Decadent feature: the argument may be a string or a number
 # (Use of this is deprecated; it should be a string as with ljust c.s.)
 def zfill(x, width):
-	if type(x) = type(''): s = x
+	if type(x) == type(''): s = x
 	else: s = `x`
 	n = len(s)
 	if n >= width: return s
diff --git a/Lib/sunaudio.py b/Lib/sunaudio.py
index 92a6203..b6e5047 100644
--- a/Lib/sunaudio.py
+++ b/Lib/sunaudio.py
@@ -44,7 +44,7 @@
 def printhdr(file):
 	hdr = gethdr(open(file, 'r'))
 	data_size, encoding, sample_rate, channels, info = hdr
-	while info[-1:] = '\0':
+	while info[-1:] == '\0':
 		info = info[:-1]
 	print 'File name:  ', file
 	print 'Data size:  ', data_size
diff --git a/Lib/tb.py b/Lib/tb.py
index ec63104..ef0c4b5 100644
--- a/Lib/tb.py
+++ b/Lib/tb.py
@@ -40,19 +40,19 @@
 			break
 		cmd = string.strip(line)
 		if cmd:
-			if cmd = 'quit':
+			if cmd == 'quit':
 				break
-			elif cmd = 'list':
+			elif cmd == 'list':
 				browserlist(tb)
-			elif cmd = 'up':
+			elif cmd == 'up':
 				if ptr-1 >= 0: ptr = ptr-1
 				else: print 'Bottom of stack.'
-			elif cmd = 'down':
+			elif cmd == 'down':
 				if ptr+1 < len(tblist): ptr = ptr+1
 				else: print 'Top of stack.'
-			elif cmd = 'locals':
+			elif cmd == 'locals':
 				printsymbols(tb.tb_frame.f_locals)
-			elif cmd = 'globals':
+			elif cmd == 'globals':
 				printsymbols(tb.tb_frame.f_globals)
 			elif cmd in ('?', 'help'):
 				browserhelp()
@@ -65,10 +65,10 @@
 	last = lineno
 	first = max(1, last-10)
 	for i in range(first, last+1):
-		if i = lineno: prefix = '***' + string.rjust(`i`, 4) + ':'
+		if i == lineno: prefix = '***' + string.rjust(`i`, 4) + ':'
 		else: prefix = string.rjust(`i`, 7) + ':'
 		line = readfileline(filename, i)
-		if line[-1:] = '\n': line = line[:-1]
+		if line[-1:] == '\n': line = line[:-1]
 		print prefix + line
 
 def browserexec(tb, cmd):
@@ -126,24 +126,24 @@
 		print
 
 def printobject(v, maxlevel):
-	if v = None:
+	if v == None:
 		print 'None',
 	elif type(v) in (type(0), type(0.0)):
 		print v,
-	elif type(v) = type(''):
+	elif type(v) == type(''):
 		if len(v) > 20:
 			print `v[:17] + '...'`,
 		else:
 			print `v`,
-	elif type(v) = type(()):
+	elif type(v) == type(()):
 		print '(',
 		printlist(v, maxlevel)
 		print ')',
-	elif type(v) = type([]):
+	elif type(v) == type([]):
 		print '[',
 		printlist(v, maxlevel)
 		print ']',
-	elif type(v) = type({}):
+	elif type(v) == type({}):
 		print '{',
 		printdict(v, maxlevel)
 		print '}',
@@ -152,7 +152,7 @@
 
 def printlist(v, maxlevel):
 	n = len(v)
-	if n = 0: return
+	if n == 0: return
 	if maxlevel <= 0:
 		print '...',
 		return
@@ -164,7 +164,7 @@
 def printdict(v, maxlevel):
 	keys = v.keys()
 	n = len(keys)
-	if n = 0: return
+	if n == 0: return
 	if maxlevel <= 0:
 		print '...',
 		return
@@ -187,8 +187,8 @@
 	cache_ok = 0
 	if _filecache.has_key(filename):
 		cached_stat, lines = _filecache[filename]
-		if stat[ST_SIZE] = cached_stat[ST_SIZE] and \
-				stat[ST_MTIME] = cached_stat[ST_MTIME]:
+		if stat[ST_SIZE] == cached_stat[ST_SIZE] and \
+				stat[ST_MTIME] == cached_stat[ST_MTIME]:
 			cache_ok = 1
 		else:
 			print 'Stale cache entry for', filename
diff --git a/Lib/test/testall.py b/Lib/test/testall.py
index 753e066..5f4a9dc 100644
--- a/Lib/test/testall.py
+++ b/Lib/test/testall.py
@@ -40,9 +40,13 @@
 if 0377 <> 255: raise TestFailed, 'octal number'
 x = 3.14
 x = 0.314
+x = .14
+x = 3.
 x = 3e14
 x = 3E14
 x = 3e-14
+x = 3.e14
+x = .14e3
 x = 0L
 x = 0l
 x = 0xffffffffffffffffL
@@ -209,11 +213,11 @@
 ### comparison: expr (comp_op expr)*
 ### comp_op: '<'|'>'|'='|'>' '='|'<' '='|'<' '>'|'in'|'not' 'in'|'is'|'is' 'not'
 if 1: pass
-if 1 = 1: pass
-if 1 < 1 > 1 = 1 >= 1 <= 1 <> 1 in 1 not in 1 is 1 is not 1: pass
-if not 1 = 1 = 1: pass
-if not 1 = 1 and 1 and 1: pass
-if 1 and 1 or 1 and 1 and 1 or not 1 = 1 = 1 and 1: pass
+if 1 == 1: pass
+if 1 < 1 > 1 == 1 >= 1 <= 1 <> 1 in 1 not in 1 is 1 is not 1: pass
+if not 1 == 1 == 1: pass
+if not 1 == 1 and 1 and 1: pass
+if 1 and 1 or 1 and 1 and 1 or not 1 == 1 == 1 and 1: pass
 
 print 'expr' # term (('+'|'-') term)*
 x = 1
@@ -236,17 +240,34 @@
 c = sys.path[0]
 x = time.time()
 x = sys.modules['time'].time()
-a = '01234'
-c = a[0]
-c = a[0:5]
-c = a[:5]
-c = a[0:]
-c = a[:]
-c = a[-5:]
-c = a[:-1]
-c = a[-4:-3]
+for a in '01234', (0,1,2,3,4), [0,1,2,3,4]:
+	c = a[0]
+	c = a[-1]
+	c = a[0:5]
+	c = a[:5]
+	c = a[0:]
+	c = a[:]
+	c = a[-5:]
+	c = a[:-1]
+	c = a[-4:-3]
+a = [0,1,2,3,4]
+del a[0]
+a = [0,1,2,3,4]
+del a[-1]
+a = [0,1,2,3,4]
+del a[1:2]
+a = [0,1,2,3,4]
+del a[:1]
+a = [0,1,2,3,4]
+del a[-1:]
+a = [0,1,2,3,4]
+a[0] = 0
+a[-1] = 4
+a[1:2] = [1]
+a[1:4] = [0]
+a[1:-1] = [1,2,3]
 
-print 'atom' # '(' [testlist] ')' | '[' [testlist] ']' | '{' '}' | '`' testlist '`' | NAME | NUMBER | STRING
+print 'atom' # '(' [tetslist] ')' | '[' [testlist] ']' | '{' '}' | '`' testlist '`' | NAME | NUMBER | STRING
 x = (1)
 x = (1 or 2 or 3)
 x = (1 or 2 or 3, 2, 3)
@@ -476,7 +497,7 @@
 reload(string)
 
 print 'type'
-if type('') <> type('123') or type('') = type(()):
+if type('') <> type('123') or type('') == type(()):
 	raise TestFailed, 'type()'
 
 
diff --git a/Lib/zmod.py b/Lib/zmod.py
index d7f06db..4f03626 100644
--- a/Lib/zmod.py
+++ b/Lib/zmod.py
@@ -53,7 +53,7 @@
 	return all
 
 def make_elements(n, d):
-	if d = 0: return [poly.one(0, 0)]
+	if d == 0: return [poly.one(0, 0)]
 	sub = make_elements(n, d-1)
 	all = []
 	for a in sub:
@@ -75,7 +75,7 @@
 	inv1 = inv[:]
 	all1.sort()
 	inv1.sort()
-	if all1 = inv1: print 'BINGO!'
+	if all1 == inv1: print 'BINGO!'
 	else:
 		print 'Sorry:', n, p
 		print all
