欢迎访问宙启技术站
智能推送

Python中可变和不可变对象的函数参数有什么区别?

发布时间:2023-09-02 16:57:41

在Python中,对象可以分为可变对象和不可变对象。可变对象是指可以在原地修改其内容的对象,而不可变对象是指不能修改其内容,修改时会创建一个新的对象。

Python的函数参数可以是可变对象和不可变对象。当将可变对象作为参数传递给函数时,函数可以修改对象的内容,而不会创建一个新的对象。而当将不可变对象作为参数传递给函数时,函数无法修改对象的内容,任何修改操作都会创建一个新的对象。

这里的可变对象和不可变对象并不是指对象本身的可变性,而是指通过对象访问其内容时是否可变。

当将可变对象作为参数传递给函数时,函数内部对该对象进行修改,会影响到函数外部的该对象。这是因为可变对象在函数内部被引用时,实际上是引用了对象的内存地址,所以可以通过内存地址修改对象的内容。

例如,当将一个列表作为参数传递给一个函数,然后在函数内部对该列表进行修改时,函数外部的该列表也会受到影响:

def modify_list(lst):
    lst.append(1)

my_list = []
modify_list(my_list)
print(my_list)  # [1]

在上面的例子中,modify_list()函数接受一个列表作为参数,并在该列表末尾添加一个元素。在函数调用后,函数外部的my_list也被修改为[1],因为在函数内部引用的是对象的内存地址。

然而,当将不可变对象作为参数传递给函数时,函数内部无法修改对象的内容,任何的修改操作都会创建一个新的对象。这是因为不可变对象在函数内部被引用时,并不是直接引用对象的内存地址,而是先创建了对象的一个副本,然后对副本进行修改。

例如,当将一个整数作为参数传递给一个函数,然后在函数内部对该整数进行修改时,函数外部的该整数不会受到影响:

def modify_number(num):
    num += 1

my_number = 1
modify_number(my_number)
print(my_number)  # 1

在上面的例子中,modify_number()函数接受一个整数作为参数,并对该整数进行加1操作。在函数调用后,函数外部的my_number没有发生变化,仍然是1。这是因为在函数内部对该整数进行修改时,实际上是对一个新的整数对象进行操作,而不是修改原始的整数对象。

需要注意的是,对于不可变对象,赋值操作并不会改变对象本身,而是创建了一个新的对象,并将变量指向新的对象。

总之,Python中可变和不可变对象的函数参数的区别在于函数对对象是否可以进行修改。对于可变对象,函数可以修改对象的内容,并影响到函数外部的对象;而对于不可变对象,函数无法修改对象的内容,任何修改操作都会创建一个新的对象。