Python 中的参数传递、返回值、浅拷贝、深拷贝

参数传递

Python中的参数传递可以分为可变对象和不可变对象两种情况。

对于不可变对象,例如数字、字符串、元组等等,传递参数时会创建其副本,以避免函数内部对参数的修改影响到函数外的变量。

对于可变对象,例如列表、字典等等,传递参数时会将引用传递给函数,函数内部对参数的修改同样会影响到函数外的变量。

下面是一些示例说明:

示例1 - 不可变对象

def change_num(num):
    num += 1
    return num

a = 1
b = change_num(a)
print(a)  # 1
print(b)  # 2

在这个例子中,参数a是一个int类型的不可变对象,change_num函数中对传入的参数num进行了加1操作,返回了修改后的值。但是对于外部的变量a,它的值并没有被修改,因为传递时创建了一个副本,而函数内部的修改只影响了这个副本。

示例2 - 可变对象

def append_list(lst):
    lst.append('d')
    return lst

my_list = ['a', 'b', 'c']
new_list = append_list(my_list)
print(my_list)  # ['a', 'b', 'c', 'd']
print(new_list)  # ['a', 'b', 'c', 'd']

在这个例子中,参数my_list是一个list类型的可变对象,append_list函数中对传入的参数lst进行了append操作,也就是在原列表中添加了元素'd',并返回了修改后的列表。由于传参时是传递引用,所以函数内部的修改同样影响了外部变量my_list。

返回值

Python中的函数可以有返回值,通过return语句来返回一个值。如果没有return语句,则默认返回None。

可以在调用函数时将返回值赋值给一个变量来接收它。也可以直接调用函数,但是如果不接收返回值,那么返回值就会被忽略。

下面是一些示例说明:

示例3 - 有返回值

def calc_sum(lst):
    return sum(lst)

my_list = [1, 2, 3, 4, 5]
result = calc_sum(my_list)
print(result)  # 15

在这个例子中,calc_sum函数接收一个列表参数lst,计算列表中所有元素的和,并通过return语句将结果返回。调用函数时将其返回值赋值给result变量来接收它,最终输出结果为15。

示例4 - 无返回值

def say_hello(name):
    print('Hello, ' + name + '!')

say_hello('Bob')  # Hello, Bob!

在这个例子中,say_hello函数接收一个字符串参数name,输出一句问候语。在调用函数时直接传入参数,函数内部的输出语句也会执行,但是没有返回值可以接收。

浅拷贝

Python中的浅拷贝是指复制一个可变对象时,只复制了最外层的容器对象,而其内部的元素对象仍是原对象中的引用。这样,在新对象和原对象之间共享的对象不再是最初的对象,而是这些对象的副本。

浅拷贝可以使用Python中的copy()或者[:]操作符来完成。

下面是一些示例说明:

示例5 - 列表浅拷贝

lst1 = [[1, 2], [3, 4]]
lst2 = lst1.copy()

lst1[0][1] = 5
print(lst1)  # [[1, 5], [3, 4]]
print(lst2)  # [[1, 5], [3, 4]]

在这个例子中,lst2是lst1的浅拷贝。在lst1的第一个元素列表中修改了其第二个元素为5后,输出发现lst2的第一个元素列表也同样做出了修改,这是因为lst1和lst2中的元素列表实际上是原始列表中同一个列表对象的引用。

示例6 - 字典浅拷贝

dict1 = {'a': [1, 2], 'b': [3, 4]}
dict2 = dict1.copy()

dict1['a'][1] = 5
print(dict1)  # {'a': [1, 5], 'b': [3, 4]}
print(dict2)  # {'a': [1, 5], 'b': [3, 4]}

在这个例子中,dict2是dict1的浅拷贝。在dict1中将'a'对应的列表的第二个元素修改为5后,输出发现dict2中的'a'对应的列表也同样被修改了,这是因为dict1和dict2中的列表实际上也是原始字典中同一个列表对象的引用。

深拷贝

Python中的深拷贝是指复制一个可变对象时,不仅复制最外层的容器对象,而且对其内部的元素对象也进行递归复制,这样就可以得到两个相互独立的完全相同的对象。

深拷贝可以使用Python中的copy模块中的deepcopy()函数来完成。

下面是一些示例说明:

示例7 - 列表深拷贝

import copy

lst1 = [[1, 2], [3, 4]]
lst2 = copy.deepcopy(lst1)

lst1[0][1] = 5
print(lst1)  # [[1, 5], [3, 4]]
print(lst2)  # [[1, 2], [3, 4]]

在这个例子中,lst2是lst1的深拷贝。在lst1的第一个元素列表中修改了其第二个元素为5后,输出发现lst2的第一个元素列表并未发生变化,这是因为lst1和lst2中的元素列表是两个完全独立的对象。

示例8 - 字典深拷贝

import copy

dict1 = {'a': [1, 2], 'b': [3, 4]}
dict2 = copy.deepcopy(dict1)

dict1['a'][1] = 5
print(dict1)  # {'a': [1, 5], 'b': [3, 4]}
print(dict2)  # {'a': [1, 2], 'b': [3, 4]}

在这个例子中,dict2是dict1的深拷贝。在dict1中将'a'对应的列表的第二个元素修改为5后,输出发现dict2中的'a'对应的列表并未发生变化,这是因为dict1和dict2中的列表也是两个完全独立的对象。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python 中的参数传递、返回值、浅拷贝、深拷贝 - Python技术站

(0)
上一篇 2023年5月13日
下一篇 2023年5月13日

相关文章

  • Python小知识之几种推导式用法示例

    Python小知识之几种推导式用法示例 推导式是Python中非常强大的一种语法特性,用于快速创建各种数据结构,可以提高代码的简洁性和可读性。本文将介绍几种常用的推导式用法,并给出详细的示例说明。 列表推导式 列表推导式是Python中最常用的推导式,用于快速创建一个列表。下面是一个简单的示例: squares = [x ** 2 for x in rang…

    python 2023年5月14日
    00
  • 使用 Python 请求模块处理两步身份验证

    【问题标题】:Handling two step authentication using Python requests module使用 Python 请求模块处理两步身份验证 【发布时间】:2023-04-02 07:05:02 【问题描述】: 我的要求是从身份验证服务器捕获 cookie,我可以使用请求模块来实现它。但是,当启用“两步验证”时,这段代…

    Python开发 2023年4月8日
    00
  • Python连接Postgres/Mysql/Mongo数据库基本操作大全

    Python连接Postgres/Mysql/Mongo数据库基本操作大全 在Python中,我们可以使用不同的方式与不同的数据库进行交互。本文将为您介绍如何使用Python连接Postgres、Mysql和Mongo数据库,并提供基本操作的示例。 连接Postgres数据库 要连接Postgres数据库,首先需要安装psycopg2模块。在终端或命令提示符…

    python 2023年5月14日
    00
  • Python接口自动化测试框架运行原理及流程

    Python接口自动化测试框架运行原理及流程 自动化测试框架运行原理:自动化测试框架主要分为三个层次,分别是基础层、关键字层和逻辑层,其运行原理如下: 基础层:最底层的是基础层,它主要提供一些底层的API调用操作,例如HTTP请求、数据库操作等。 关键字层:在基础层的基础上,构建关键字层,即将常用的测试步骤封装成具有复用性的函数,其中每一个函数都代表着一个测…

    python 2023年5月19日
    00
  • Python字符串的转义字符

    Python字符串是由多个字符组成的数据类型,字符串中的字符可以使用单引号、双引号或者三重引号括起来。在Python字符串中,可以使用转义字符来表示一些特殊的字符或字符序列,例如换行符、制表符等。 下面是一些常用的Python字符串转义字符及其含义: \n:表示换行符; \t:表示制表符; \’: 表示单引号; \”: 表示双引号; \:表示反斜杠。 在Py…

    python 2023年6月5日
    00
  • python通过zlib实现压缩与解压字符串的方法

    Python中的zlib库提供了压缩和解压缩数据的功能。在本文中,我们将使用Python中的zlib库来压缩和解压字符串。 环境准备 在使用Python的zlib库之前,需要确保已经安装了Python。可以使用以下命令确认是否已经安装了Python: python –version 如果显示Python的版本,那么说明已经安装了。否则,需要先安装Pytho…

    python 2023年6月5日
    00
  • Python获取CPU、内存使用率以及网络使用状态代码

    获取CPU、内存使用率以及网络使用状态是一项非常有用的任务,可以帮助我们对系统的运行状态有更好的了解。下面是Python获取CPU、内存使用率以及网络使用状态的完整攻略: 1. 获取CPU使用率 Python可以通过psutil库来获取CPU使用率。首先需要使用pip安装psutil库: pip install psutil 接下来,可以使用如下代码来获取C…

    python 2023年6月2日
    00
  • Python使用itchat 功能分析微信好友性别和位置

    标题 Python使用itchat功能分析微信好友性别和位置 简介 itchat是一个Python库,可实现微信个人账号的接口,从而实现在Python中控制微信。本文将介绍如何使用itchat实现分析微信好友性别和位置的功能。 步骤 3.1 安装itchat 在终端或命令行中执行命令: pip install itchat 3.2 登录微信 使用itchat…

    python 2023年6月6日
    00
合作推广
合作推广
分享本页
返回顶部