python技能实践系列(五)--从多维数组赋值到python两种对象再到深浅拷贝

  • 问题引入
a = [[0]*3 ] * 4
print(a)
a[0][0]=1
print(a)

初始化4行3列的二维数组,想把第一行和第一列的位置赋值为1
在这里插入图片描述

  • 为何会这个样子?a[i][0]都变成1了
    其实[]*N 这种方式初始化的数组,相当于只申请了一个地址空间。空间存储[0,0,0],然后二维数组的四个指针都指向同一个空间。无论修改哪一个,全部值都会改变。id()看下他们的物理位置都是一样的。
    在这里插入图片描述

  • python两种变量
    Python 没有「变量」,我们平时所说的变量其实只是「标签」,是引用。

    • 可变对象
      对象指向的内存中的值会改变,当更改这个变量的时候,还是指向原来内存中的值,并且在原来的内存值进行原地修改,并没有开辟新的内存。例如列表List,字典dict,集合set。
    • 不可变对象
      对象所指向的内存中的值不能被改变,当改变这个变量的时候,原来指向的内存中的值不变,变量不再指向原来的值,而是开辟一块新的内存,变量指向新的内存。例如:数值类型int 、float;字符串str ;元组tuple;bool类型的对象。
      在这里插入图片描述
      所以对两种变量的引用赋值引起的结果是不一样的。开篇的问题就是由此引出。
  • 只想赋值a[0][0],怎么做?

a=[[0]*3 for i in range(4)]
print(a)
a[0][0]=1
print(a)

在这里插入图片描述
上述写法每个一维数组都申请了一个内存空间。改变其中一个不会影响其他。

  • 深拷贝和浅拷贝
    • 浅拷贝 shallow copy
a = [0, [1, 2], 3]
b = a[:]
a[0] = 8
a[1][1] = 9

在这里插入图片描述
* 深拷贝 deep copy

import copy
a = [0, [1, 2], 3]
b = copy.deepcopy(a)
a[0] = 8
a[1][1] = 9

在这里插入图片描述

  • 总结
    • 没有限制条件的分片表达式(L[:])能够复制序列,但此法只能浅层复制。

    • 字典 copy 方法,D.copy() 能够复制字典,但此法只能浅层复制

    • 有些内置函数,例如 list,能够生成拷贝 list(L)

    • copy 标准库模块能够生成完整拷贝:deepcopy 本质上是递归 copy

    • 对于不可变对象和可变对象来说,浅复制都是复制的引用,只是因为复制不变对象和复制不变对象的引用是不等效的(因为对象不可变,当改变时会新建对象重新赋值)。所以看起来浅复制只复制不可变对象(整数,实数,字符串等),对于可变对象,浅复制其实是创建了一个对于该对象的引用,也就是说只是给同一个对象贴上了另一个标签而已。

    • 这个文章讲得更详细
      python基础(5):深入理解 python 中的赋值、引用、拷贝、作用域

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python 多维数组赋值可以使用循环结构或者 Numpy 库来完成。 使用循环结构时,可以使用嵌套的 for 循环来遍历多维数组,并使用列表推导式或者直接赋值的方式来对数组元素赋值。例如,以下代码演示了对一个 3x3 的二维数组进行赋值: ```python array_2D = [[0 for j in range(3)] for i in range(3)] # 初始化二维数组 for i in range(3): for j in range(3): array_2D[i][j] = i * 3 + j # 对二维数组元素赋值 print(array_2D) # 输出二维数组 ``` 使用 Numpy 库时,可以使用 `numpy.array()` 函数来创建 n 维数组,并使用切片或索引的方式来对数组元素赋值。例如,以下代码演示了对一个 3x3 的二维数组进行赋值: ```python import numpy as np # 导入 Numpy 库 array_2D = np.array([[0, 0, 0], # 创建二维数组 [0, 0, 0], [0, 0, 0]]) array_2D[:, :] = np.arange(9).reshape((3, 3)) # 对二维数组元素赋值 print(array_2D) # 输出二维数组 ``` 无论是使用循环结构还是 Numpy 库,都可以用类似的方式来对多维数组进行赋值。但是 Numpy 库在大规模数据处理时,具有非常高效的性能和易用性,建议在需要处理大规模数据时优先选择使用 Numpy 库来完成。 ### 回答2: 在Python中,我们可以通过列表和numpy库来创建多维数组数组可以是任何维度。在多维数组中,要对数组进行赋值,需要先了解数组的索引方式。 在Python中,数组的索引从0开始,且可以使用负数来表示从数组末尾开始计数的索引位置。例如,在二维数组中,使用array[1][3]表示第二行的第四个元素,而使用array[-1][-2]表示最后一行的倒数第二个元素。 赋值多维数组的方法也比较简单。例如,我们可以使用以下语句为二维数组中的每个元素赋值: ```python arr = [[0 for j in range(n)] for i in range(m)] ``` 这个语句将创建一个m行n列的二维数组,并将数组中的每个元素初始化为0。我们也可以使用类似的方法在numpy中创建多维数组并进行赋值: ```python import numpy as np arr = np.zeros((m, n)) ``` 在numpy中,还可以使用以下语句为多维数组中的某些元素赋值: ```python arr[1][3] = 4 # 将第二行第四个元素赋值为4 arr[-1][-2] = 3 # 将最后一行的倒数第二个元素赋值为3 ``` 我们还可以使用切片来给多维数组赋值。例如,在二维数组中,我们可以使用以下语句将第一行的所有元素都设置为1: ```python arr[0][:] = 1 ``` 同样的,我们还可以使用以下语句将第一列的所有元素都设置为2: ```python arr[:,0] = 2 ``` 总结来说,赋值多维数组的方法有很多种,要根据具体的数组结构和赋值需求来选择最合适的方法。需要注意的是,在赋值多维数组时,索引位置不能超出数组范围,否则会出现IndexError异常。 ### 回答3: Python 是一种高级编程语言,它提供了很多方便的功能,其中一个重要的功能是多维数组赋值。在多维数组中,数据通常被保存在一个二维或三维的矩阵中,我们可以使用 Python 中的列表或数组来创建多维数组。 在 Python 中,创建一个多维数组通常需要指定其行列数或维度,如下所示: ```python # 创建一个 3 行 4 列的二维数组 matrix = [[0 for col in range(4)] for row in range(3)] ``` 在上面的代码中,我们使用列表推导式来创建一个 3 行 4 列的二维数组,其中每个元素都被初始化为 0。现在,我们可以通过索引来访问数组中的元素,如下所示: ```python matrix[0][0] = 1 # 将 (0,0) 位置的元素设置为 1 matrix[1][2] = 3 # 将 (1,2) 位置的元素设置为 3 ``` 在上面的代码中,我们使用两个索引来访问数组中的元素。第一个索引表示所访问元素所在的行数,第二个索引表示所访问元素所在的列数。 除了使用嵌套的列表来创建多维数组,我们还可以使用 NumPy 库来创建和操作多维数组。NumPy 是一个强大的数学库,它提供了很多数组和矩阵操作函数,可以帮助我们更方便地创建和操作多维数组。 在 NumPy 中,我们可以使用 `numpy.array()` 函数来创建一个多维数组,如下所示: ```python import numpy as np # 创建一个 2 行 3 列的二维数组 arr = np.array([[1, 2, 3], [4, 5, 6]]) ``` 在上面的代码中,我们首先导入了 NumPy 库,并使用 `numpy.array()` 函数创建一个 2 行 3 列的二维数组。现在,我们可以使用索引来访问数组中的元素,如下所示: ```python arr[0, 0] = 7 # 将 (0,0) 位置的元素设置为 7 arr[1, 2] = 8 # 将 (1,2) 位置的元素设置为 8 ``` 在上面的代码中,我们使用逗号分隔的两个索引来访问数组中的元素,与使用列表的方式不同。 总的来说,Python 提供了多种方法来创建和操作多维数组,我们可以根据具体的需求选择合适的方法。在使用多维数组时,我们应该熟悉数组的索引和切片操作,这将有助于我们更方便地访问和修改数组中的元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值