Python的赋值引用, 浅拷贝和深拷贝

简介: Python的赋值引用, 浅拷贝和深拷贝

前言


有个朋友昨天问了我这个问题, 刚好挺长时间没写博客了, 就顺便划划水


赋值引用


赋值引用其实就是最基本也是最常用的引用, 即:

a = [1, 2, 3]
b = a
a[0] = 2
print(b)   # [2, 2, 3]


就相当于下面的过程


20200227102759206.png

所以当b=a时, 其实就是将b指向a的内存地址, 当a改变的时候, b也会随之改变


浅拷贝


浅拷贝就是只复制一份最外层元素, 生成一个新的内存地址, 但是如果原元素里有子对象, 比如列表字典这种, 就还是会指向之前的内存地址


import copy
a = [1, 2, [3, 4]]
b = copy.copy(a)
a.append(5)
print(b)  # [1, 2, [3, 4]]
a[2].append(6)
print(a)  # [1, 2, [3, 4, 6], 5]
print(b)  # [1, 2, [3, 4, 6]]

20200227105420946.png


列表的切片就是浅拷贝


深拷贝


深拷贝其实就没啥说的了, 就是完全复制前对象, 跟前对象没有任何的关系

import copy
a = [1, 2, [3, 4]]
b = copy.deepcopy(a)
a.append(5)
print(b)  # [1, 2, [3, 4]]
a[2].append(6)
print(a)  # [1, 2, [3, 4, 6], 5]
print(b)  # [1, 2, [3, 4]]

20200227105834943.png

完全独立


补充


数字和字符串都是对源对象的引用, 即只是指向不同的内存地址

目录
相关文章
|
22天前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
40 14
|
17天前
|
存储 Python
[oeasy]python056_python中下划线是什么意思_underscore_理解_声明与赋值_改名字
在Python中,下划线有多种用途。单下划线(_)常用于避免命名冲突,如将`max`改为`max_`以保留内置函数功能。双下划线(__var__)通常用于特殊方法和属性,如`__name__`、`__doc__`等。此外,单下划线(_)在交互式解释器中表示上一次表达式的值,但不建议作为普通变量名使用。总结:下划线用于避免命名冲突及特殊标识。
22 1
|
1月前
|
Python 容器
[oeasy]python048_用变量赋值_连等赋值_解包赋值_unpack_assignment _
本文介绍了Python中变量赋值的不同方式,包括使用字面量和另一个变量进行赋值。通过`id()`函数展示了变量在内存中的唯一地址,并探讨了变量、模块、函数及类类型的地址特性。文章还讲解了连等赋值和解包赋值的概念,以及如何查看已声明的变量。最后总结了所有对象(如变量、模块、函数、类)都有其类型且在内存中有唯一的引用地址,构成了Python系统的基石。
32 5
|
2月前
|
存储 Python 容器
[oeasy]python045_[词根溯源]赋值_assignment_usage_使用
本文回顾了上一次讲解的内容,重点讨论了变量的概念及其在各种系统和游戏中的应用。文章详细解释了变量的声明与赋值操作,强调了赋值即为将具体值存储到变量名下的过程。同时,通过例子说明了字面量(如数字0)不能被赋值给其他值的原因。此外,还探讨了“赋值”一词的来源及其英文表达“assignment”的含义,并简要介绍了与之相关的英语词汇,如sign、assign、signal等。最后,总结了本次课程的核心内容,即赋值操作的定义和实现方式。
34 3
|
2月前
|
Python
Python赋值运算符
Python赋值运算符。
30 2
|
3月前
|
存储 Java 编译器
Python学习三:学习python的 变量命名规则,算数、比较、逻辑、赋值运算符,输入与输出。
这篇文章是关于Python编程语言中变量命名规则、基本数据类型、算数运算符、比较运算符、逻辑运算符、赋值运算符以及格式化输出与输入的详细教程。
35 0
Python学习三:学习python的 变量命名规则,算数、比较、逻辑、赋值运算符,输入与输出。
|
3月前
|
API 开发者 索引
Python中的省略号(Ellipsis)赋值方式
在Python中,省略号(`...`)是一种特殊对象,称为Ellipsis,虽不常用但在特定场景下非常实用,如函数占位、未实现方法示例及NumPy数组处理。本文通过示例介绍`a = ...`的用法。省略号类似于`None`,可用作代码结构的占位符,保持代码完整性和可读性,同时在API设计中标识待实现的方法。特别是在NumPy中,省略号用于表示多维数组的剩余维度,简化数组操作,提高代码灵活性和可读性。掌握这一技巧有助于提升Python编程能力。
100 0
|
5月前
|
数据处理 Python
python变量重新赋值
【8月更文挑战第4天】
227 6
|
5月前
|
API Python
python中copy模块的使用,深拷贝和浅拷贝
python中copy模块的使用,深拷贝和浅拷贝
53 0
|
6月前
|
Python
python包引用方式总结
python包引用方式总结
68 0