Python中的可变参数和不可变参数的区别
在 Python 中,函数的参数分为可变参数和不可变参数。 在函数中,对于不同的参数类型,参数的处理方式也不同,这是因为在 Python 中,参数的编程方式是完全不同的。一些参数可能是可以被改变的,而另一些是无法被改变的,因此,我们需要了解可变参数和不可变参数的区别。在此文中,我们将详细介绍它们之间的差异。
可变参数
可变参数是指你传递给一个函数的参数可以包含任意数量的变量。 Python 中的列表(List)和元组(Tuple)都是可变参数。这意味着对于可变参数,你可以根据需要传递任意数量的值。示例如下:
def my_sum(*args):
result = 0
for i in args:
result += i
return result
print(my_sum(1, 2, 3, 4, 5))
在这个例子中,我们使用了一个星号 (*args) 来表示参数可以是任意数量的。当你需要传递任意数量的变量时,这将非常有用。在函数内部,我们使用 args 这个参数名。通过对 args 进行迭代,我们可以将这些值相加并返回结果。
不可变参数
不可变参数与可变参数相反。在传递不可变参数时,你不能改变传递给函数的该参数的值。Python 中的数字(Number)和字符串(String)都是不可变参数。
在下面的例子中,我们定义了一个简单的函数来演示不可变参数:
def my_func(x):
x += 10
return x
a = 5
b = my_func(a)
print(a)
在这个例子中,我们将数字 5 传递给函数 my_func,因为数字是不可变的,所以当我们将它传递给函数时,函数会得到它的值的一个复制。在函数中,我们同时对该值进行加法运算和重新分配。由于数字是不可变的,所以我们不能修改传递给函数的值,所以结果将返回 15,而原始变量仍然是 5。
字符串也是一种不可变的参数类型,因此,具有相同属性。下面的示例说明了这一点:
def to_upper_case(name):
name = name.upper()
return name
my_name = "john"
new_name = to_upper_case(my_name)
print(my_name)
在这个例子中,我们将字符串 "john" 传递给函数 to_upper_case。在该函数中,我们先使用 upper() 方法转换字符串中的小写字母为大写字母,然后对该变量重新分配。由于字符串是不可变的,所以我们不能修改传递给函数的值。因此,该函数将返回 "JOHN",而原始的字符串 my_name 将保持为 "john"。
可变参数和不可变参数的重要区别
可变参数和不可变参数之间的最大区别是它们的处理方式。在 Python 中,可变参数可以更改,而不可变参数是不能更改的。如果你在函数中更改任何不可变参数,它会创建一个新的参数对象。另一方面,如果你在函数中更改可变参数,它会更改原始参数对象。
以下示例说明了这种区别:
可变参数:
def change_args(my_list):
my_list.append(4)
return my_list
my_list = [1, 2, 3]
new_list = change_args(my_list)
print(my_list)
输出:
[1, 2, 3, 4]
在这个示例中,我们将一个列表传递给函数 change_args。在函数内部,我们将新的元素添加到该列表中,并返回传递给函数的值。由于列表是可变的,我们可以向其添加新元素。所以当我们在函数 change_args 中修改 my_list 的时候,原始列表也会发生变化。
不可变参数:
def change_args(my_str):
my_str += "Hello"
return my_str
my_str = "Hi there, "
new_str = change_args(my_str)
print(my_str)
输出:
Hi there,
在这个示例中,我们将字符串 "Hi there," 传递给函数 change_args。函数中我们将 "Hello" 附加到该字符串。由于字符串是不可变的,我们不能修改传递给函数的值。所以函数将返回 "Hi there, Hello"。由于我们不能修改 my_str,所以原始字符串将保持为 "Hi there,"。
总结
在 Python 中,可变参数和不可变参数之间有着重要的区别。可变参数可以被更改,而不可变参数不能。当传递不可变参数时,函数会得到这个参数的值的一个复制。如果函数内部更改了该参数的值,它会创建一个新的参数对象。但是,当传递可变参数时,函数将得到一个指向相同对象的指针。因此,在函数内部对该参数进行的任何更改都会更改原始参数对象。理解这些概念对于编写正确的 Python 代码非常重要。
