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 实现存储数据到txt和pdf文档及乱码问题的解决

    对于“python 实现存储数据到txt和pdf文档及乱码问题的解决”的攻略,我们可以从以下几个方面进行讲解: 存储数据到txt文档 存储数据到pdf文档 乱码问题及解决方案 1. 存储数据到txt文档 在Python中,我们可以使用open()函数打开和操作文件。为了将数据存储到txt文档中,我们需要使用文件的写入模式(”w”),并向文件中写入我们需要的数…

    python 2023年5月20日
    00
  • python办公自动化之excel的操作

    Python办公自动化之Excel的操作 Excel是办公中经常用到的一种表格处理工具,Python可以通过openpyxl库对Excel进行读写操作,实现Excel办公自动化,提高办公效率。下面是Excel读写操作的完整攻略。 1. 安装openpyxl库 首先需要安装openpyxl库,可以通过pip命令在命令行安装: pip install openp…

    python 2023年5月19日
    00
  • python requests使用socks5的例子

    以下是关于Python requests使用socks5的例子的完整攻略: Python requests使用socks5的例子 在Python中,我们可以使用requests库发送HTTP请求。如果需要使用socks5代理来发送请求,我们可以使用requests库的socks模块。以下是Python requests使用socks5的例子的攻略。 安装Py…

    python 2023年5月15日
    00
  • Python数据分析之pandas读取数据

    下面就给您详细讲解“Python数据分析之pandas读取数据”的完整实例教程。 1. 简介 pandas是Python中一种非常流行的数据分析工具,支持读取多种数据格式,比如CSV、Excel、SQL、JSON等等。pandas读取数据的API非常简单,但对于初学者来说,也有一些需要注意的细节。在本文中,我们将演示如何使用pandas从各种数据源中加载数据…

    python 2023年5月13日
    00
  • Python实现直播弹幕自动发送功能

    Python实现直播弹幕自动发送功能攻略 直播弹幕自动发送功能的实现,本质上需要模拟用户登录直播平台、打开直播间页面、向直播间发送弹幕等一系列操作。其中,Python作为一门强大的脚本语言,可以通过第三方库实现这些任务。下面我们提供一个Python实现直播弹幕自动发送功能的攻略,帮助您开始自己的实现。 步骤1:确定目标直播平台 请确定您需要自动发送弹幕的直播…

    python 2023年6月6日
    00
  • Java8 lambda表达式2种常用方法代码解析

    下面我会详细讲解一下“Java8 lambda表达式2种常用方法代码解析”的攻略,包含以下几个部分: 什么是Java8的lambda表达式 Lambda表达式的语法定义 Lambda表达式的应用场景 Java8中Lambda表达式的两种常用方法及代码解析 示例说明 总结与展望 1. 什么是Java8的lambda表达式 在Java8中引入了Lambda表达式…

    python 2023年6月3日
    00
  • python正则表达式从字符串中提取数字的思路详解

    Python正则表达式从字符串中提取数字的思路详解 在Python中,正则表达式是一种非常强大的工具可以用于从字符串中提取数字。本攻略将详细讲解Python正则表达从字符串中提取数字的思路,包括正则表达式的基本语法、常用的正则表达式模式、以及如何使用正则表达式从字符串中提取数字。同时,也会探讨如何处理特殊情况。 正则表达式基本语法 正则表达式是一种用于匹配文…

    python 2023年5月14日
    00
  • python 调试冷知识(小结)

    Python调试冷知识(小结) 在Python编程中,调试是非常重要的一环。在调试过程中,我们需要使用各种工具和技巧来定位和解决问题。本文将详讲解Python调试冷识(小结),包括使用pdb调试、使用traceback模块、使用logging模块等。在过程中,提供个示例说明,助读者更好地理解Python调试的注意事项。 使用pdb调试 pdb是Python自…

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