Index: django/contrib/admin/options.py
===================================================================
--- django/contrib/admin/options.py	(revision 9050)
+++ django/contrib/admin/options.py	(working copy)
@@ -266,11 +266,11 @@
         if self.exclude is None:
             exclude = []
         else:
-            exclude = self.exclude
+            exclude = list(self.exclude)
         defaults = {
             "form": self.form,
             "fields": fields,
-            "exclude": exclude + kwargs.get("exclude", []),
+            "exclude": exclude + list(kwargs.pop("exclude", [])),
             "formfield_callback": self.formfield_for_dbfield,
         }
         defaults.update(kwargs)
@@ -780,13 +780,13 @@
         if self.exclude is None:
             exclude = []
         else:
-            exclude = self.exclude
+            exclude = list(self.exclude)
         defaults = {
             "form": self.form,
             "formset": self.formset,
             "fk_name": self.fk_name,
             "fields": fields,
-            "exclude": exclude + kwargs.get("exclude", []),
+            "exclude": exclude + list(kwargs.pop("exclude", [])),
             "formfield_callback": self.formfield_for_dbfield,
             "extra": self.extra,
             "max_num": self.max_num,
Index: tests/regressiontests/modeladmin/models.py
===================================================================
--- tests/regressiontests/modeladmin/models.py	(revision 9050)
+++ tests/regressiontests/modeladmin/models.py	(working copy)
@@ -37,7 +37,7 @@
 
 __test__ = {'API_TESTS': """
 
->>> from django.contrib.admin.options import ModelAdmin, HORIZONTAL, VERTICAL
+>>> from django.contrib.admin.options import ModelAdmin, StackedInline, HORIZONTAL, VERTICAL
 >>> from django.contrib.admin.sites import AdminSite
 
 None of the following tests really depend on the content of the request, so
@@ -123,7 +123,31 @@
 >>> ma = BandAdmin(Band, site) 
 >>> ma.get_form(request).base_fields.keys() 
 ['name', 'sign_date']
- 
+
+# Using a tuple for `exclude`.
+
+>>> class BandAdmin(ModelAdmin): 
+...     exclude = ('bio',)
+>>> ma = BandAdmin(Band, site) 
+>>> ma.get_form(request).base_fields.keys() 
+['name', 'sign_date']
+
+# Combining `exclude` tuple on the class and `exclude` list as get_form parameter.
+
+>>> class BandAdmin(ModelAdmin): 
+...     exclude = ('bio',)
+>>> ma = BandAdmin(Band, site) 
+>>> ma.get_form(request, exclude=['sign_date']).base_fields.keys() 
+['name']
+
+# Combining `exclude` tuple on the class and `exclude` tuple as get_form parameter.
+
+>>> class BandAdmin(ModelAdmin): 
+...     exclude = ('bio',)
+>>> ma = BandAdmin(Band, site) 
+>>> ma.get_form(request, exclude=('sign_date',)).base_fields.keys() 
+['name']
+
 # Using `fields` and `exclude`.
 
 >>> class BandAdmin(ModelAdmin): 
@@ -133,6 +157,57 @@
 >>> ma.get_form(request).base_fields.keys() 
 ['name']
 
+# Using `exclude` on an inline admin.
+
+>>> class ConcertAdmin(StackedInline): 
+...     model = Concert
+...     fk_name = 'main_band'
+...     exclude = ['transport'] 
+>>> ma = ConcertAdmin(Band, site) 
+>>> ma.get_formset(request).form.base_fields.keys() 
+['opening_band', 'day']
+
+# Using a tuple for `exclude` on an inline admin.
+
+>>> class ConcertAdmin(StackedInline): 
+...     model = Concert
+...     fk_name = 'main_band'
+...     exclude = ('transport',)
+>>> ma = ConcertAdmin(Band, site) 
+>>> ma.get_formset(request).form.base_fields.keys() 
+['opening_band', 'day']
+
+# Combining `exclude` tuple on the class and `exclude` list as get_form parameter on inline.
+
+>>> class ConcertAdmin(StackedInline): 
+...     model = Concert
+...     fk_name = 'main_band'
+...     exclude = ['transport'] 
+>>> ma = ConcertAdmin(Band, site) 
+>>> ma.get_formset(request, exclude=['opening_band']).form.base_fields.keys() 
+['day']
+
+# Combining `exclude` tuple on the class and `exclude` tuple as get_form parameter on inline.
+
+>>> class ConcertAdmin(StackedInline): 
+...     model = Concert
+...     fk_name = 'main_band'
+...     exclude = ['transport'] 
+>>> ma = ConcertAdmin(Band, site) 
+>>> ma.get_formset(request, exclude=('opening_band',)).form.base_fields.keys() 
+['day']
+
+# Using `fields` and `exclude` on inline.
+
+>>> class ConcertAdmin(StackedInline): 
+...     model = Concert
+...     fk_name = 'main_band'
+...     fields = ['opening_band', 'transport']
+...     exclude = ['transport'] 
+>>> ma = ConcertAdmin(Band, site) 
+>>> ma.get_formset(request).form.base_fields.keys() 
+['opening_band']
+
 If we specify a form, it should use it allowing custom validation to work
 properly. This won't, however, break any of the admin widgets or media.
 
