python数组的赋值和拷贝

本文通过实例演示了Python中对象的引用与拷贝的区别,包括浅拷贝与深拷贝的概念及应用场景,特别针对numpy数组的操作进行了说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接看demo

numpy 有 copy()函数, list没有,需导入copy库

>>> a = np.array([1,2,3])
>>> b = np.array([4,5,6])
>>> (a==b).all() #比较两个数组元素是否都相等, 可以用于k-means
False
>>> c=a
>>> (a==c).all()
True
>>> c[0] = 10  #等号这种赋值相当对象引用(内存地址)传递,改变c, a也跟着变了,所有不管怎么改都是true
>>> (a==c).all()
True
>>> a
array([10,  2,  3])
>>> c
array([10,  2,  3])


>>> d = a.copy() #这是浅拷贝
>>> (a==d).all()
True
>>> a
array([10,  2,  3])
>>> d[0] =20
>>> (a==d).all()
False
>>> d
array([20,  2,  3])
>>> a
array([10,  2,  3])

ref: http://python.jobbole.com/82294/
Python中对象的赋值都是进行对象引用(内存地址)传递。
使用copy.copy(),可以进行对象的浅拷贝,它复制了对象,但对于对象中的元素,依然使用原始的引用, 但是当改变的list的元素是不可变类型,所以will对应的list的第一个元素会使用一个新的对象。
如果需要复制一个容器对象,以及它里面的所有元素(包含元素的子元素),可以使用copy.deepcopy()进行深拷贝。
对于非容器类型(如数字、字符串、和其他’原子’类型的对象)没有被拷贝一说。

### Python数组赋值方法 在 Python 中,列表(`list`)通常被用来表示数组。对于这些对象之间的赋值操作有多种方式。 #### 直接赋值 当一个已存在的列表变量直接赋值给新的变量名时,并不是创建了一个独立副本而是两个名称指向同一个列表对象。这意味着修改任何一个都会影响另一个[^3]。 ```python original_list = [1, 2, 3] new_reference = original_list # 这里并没有真正复制列表的内容 print(new_reference) # 输出: [1, 2, 3] # 修改其中一个会影响另外一个 new_reference.append(4) print(original_list) # 输出: [1, 2, 3, 4] ``` #### 使用切片进行浅拷贝 通过使用完整的切片语法可以得到原列表的一个浅拷贝。这种方式下,原始列表新列表是相互独立的,除非它们内部含有可变类型的元素如其他列表,则那些嵌套的对象仍然共享相同的实例[^1]。 ```python source_array = ['apple', 'banana', 'cherry'] copied_array = source_array[:] # 利用切片来创建一个新的列表 print(copied_array) # 对 copied_array 的更改不影响 source_array copied_array[0] = 'orange' print(source_array) # 原始列表保持不变 print(copied_array) # 更改后的列表显示更新的结果 ``` #### copy() 方法深拷贝单层列表 为了更清晰地表达意图并适用于更多场景,还可以调用 `copy()` 方法来进行浅层次的一次性复制。这同样只针对顶层元素有效;如果存在多级嵌套的数据结构则需考虑更深层面的复制需求。 ```python simple_list = ["red", "green", "blue"] another_copy = simple_list.copy() print(another_copy) # 测试互不干扰特性 another_copy.pop() print(simple_list) # 不受影响 print(another_copy) # 已经移除了最后一个元素 ``` #### deepcopy 深度复制复杂数据结构 面对包含多个层级或不可变容器内含可变对象的情况,应当采用来自 `copy` 模块下的 `deepcopy()` 函数以确保获得完全独立的新实体。 ```python import copy nested_structure = [[1, 2], [3, 4]] fully_independent_clone = copy.deepcopy(nested_structure) print(fully_independent_clone) # 验证深层克隆效果 fully_independent_clone[0][0] = 999 print(nested_structure) # 应该没有任何变化 print(fully_independent_clone) # 显示的是经过修改后的版本 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值