鱼C论坛

 找回密码
 立即注册
查看: 1067|回复: 17

求问,python中,列表的分片和矩阵的分片为什么不一样啊

[复制链接]
发表于 2018-9-6 22:03:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
甲鱼老师上课讲过,用过分片得到的新列表(b = a[:])是不会随a的内容的变化而变化的,但为什么同样操作的矩阵,(b = a[:]),b甲鱼老师上课讲过,用过分片得到的新列表(b = a[:])是不会随a的内容的变化而变化的,但为什么同样操作的矩阵,(b = a[:]),b的内容改变,a的内容就变了呢?的内容改变,a的内容就变了呢?
  1. import numpy as np
  2. >>> a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
  3. >>> print(a)
  4. [[ 1  2  3  4]
  5. [ 5  6  7  8]
  6. [ 9 10 11 12]]
  7. >>> b = a[:,:]
  8. >>> print(b)
  9. [[ 1  2  3  4]
  10. [ 5  6  7  8]
  11. [ 9 10 11 12]]
  12. >>> b[0,0] = 44
  13. >>> print(b)
  14. [[44  2  3  4]
  15. [ 5  6  7  8]
  16. [ 9 10 11 12]]
  17. >>> print(a)
  18. [[44  2  3  4]
  19. [ 5  6  7  8]
  20. [ 9 10 11 12]]
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-9-6 22:54:05 | 显示全部楼层
切片是【:】,用【,】变成下标了……自己搞错啦~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-6 22:59:47 | 显示全部楼层
claws0n 发表于 2018-9-6 22:54
切片是【:】,用【,】变成下标了……自己搞错啦~

切片是[...,x]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-7 02:07:39 | 显示全部楼层

但是,对于一个矩阵,要分别对行和列进行切片欸,所以要有两个部分,中间用逗号分开,我试了一下,即使写成b = a[:],得到的矩阵还是联动的,和列表不一样。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-7 03:31:11 | 显示全部楼层
lanlan_lanlan 发表于 2018-9-7 02:07
但是,对于一个矩阵,要分别对行和列进行切片欸,所以要有两个部分,中间用逗号分开,我试了一下,即使写 ...
  1. import numpy as np

  2. a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
  3. b = a[:,0]
  4. c = a[0,:]
  5. d = a[0,0:2]
复制代码
  1. >>> a
  2. array([[ 1,  2,  3,  4],
  3.        [ 5,  6,  7,  8],
  4.        [ 9, 10, 11, 12]])
  5. >>> b
  6. array([1, 5, 9])
  7. >>> c
  8. array([1, 2, 3, 4])
  9. >>> d
  10. array([1, 2])
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-7 08:04:26 | 显示全部楼层
2层深度及以上的地址内容还是指向一个地方
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-7 09:28:48 | 显示全部楼层

他的问题是,为什么改变b的值会导致a的值也会发生变化。  
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-7 09:32:46 | 显示全部楼层
wongyusing 发表于 2018-9-7 09:28
他的问题是,为什么改变b的值会导致a的值也会发生变化。

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-7 09:34:20 | 显示全部楼层
数据结构不一样 array 才是真正的数组,python 的 list 是双向链表。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-7 09:34:42 | 显示全部楼层

我测试了一下,我自己也蒙比了。
我们一直在改变b的值,都不去操作a。  
为什么a的值就改变了呢??
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-7 09:53:13 | 显示全部楼层
本帖最后由 claws0n 于 2018-9-7 09:55 编辑
wongyusing 发表于 2018-9-7 09:34
我测试了一下,我自己也蒙比了。
我们一直在改变b的值,都不去操作a。  
为什么a的值就改变了呢??


python 是 C 写的。numpy 作为一个特别处理运算的模组,也延续了 C 的多数方法。如果你用 numpy array 去处理数据,你就会发现到它的效能远远超越 list。问题来了,python 不像 C 语言,需要声明变量的大小,也就是说这个 array 可以一直扩展(只要空间足够)。那么如果要处理数据,不可能只有一个矩阵,所以为了避免空间的浪费以及运算效率的考量,在面对 array 时,跟 C 一样,面对的是指针。指针在 python 叫标签吧~

如果你确定要复制一份,b = a.copy()
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-7 09:54:07 | 显示全部楼层
本帖最后由 wongyusing 于 2018-9-7 09:56 编辑
claws0n 发表于 2018-9-7 09:34
数据结构不一样 array 才是真正的数组,python 的 list 是双向链表。


不用numpy的情况一样的,都会是改变a的值
  1. Python 3.6.5 |Anaconda, Inc.| (default, Apr 29 2018, 16:14:56)
  2. [GCC 7.2.0] on linux
  3. Type "help", "copyright", "credits" or "license" for more information.
  4. >>> a = [[1,2,3,4], [5,6,7,8], [9,10,11,12]]
  5. >>> print(a)
  6. [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
  7. >>> b = a
  8. >>> print(b)
  9. [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
  10. >>> b[0][0] = 44
  11. >>> print(b)
  12. [[44, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
  13. >>> print(a)
  14. [[44, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-7 10:11:56 | 显示全部楼层
wongyusing 发表于 2018-9-7 09:54
不用numpy的情况一样的,都会是改变a的值

但是 array 对 list 是相容的,所以内部也是一个数组

a = [[A] ,[B],[C],[D]]
b = a[::]   >>  id(b) != id(a)
但是  id(b[0][0]) == id(a[0][0])
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-7 21:58:04 | 显示全部楼层
claws0n 发表于 2018-9-7 09:53
python 是 C 写的。numpy 作为一个特别处理运算的模组,也延续了 C 的多数方法。如果你用 numpy array  ...

我还是用。copy()比较保险
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-8 09:25:42 From FishC Mobile | 显示全部楼层
copy()也一样,要用copy模块里的deepcopy()(深拷贝),具体比较复杂,可以搜索浅拷贝和深拷贝
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-9 00:27:24 From FishC Mobile | 显示全部楼层
我觉得是对于嵌套列表的拷贝是贴标签。不像一维的是拷贝出来。试一试以下的例子。
a = [[2, 3, 4], 5, 6]
b = a[:]
b[0][0] = 1
请问此时a[0][0]是多少?
b[1] = 4
此时a[1]为多少?
c = a[1:]
c.insert(0, a[0][:])
c[0][0] = 9
这时a[0][0]为多少?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-9 00:33:21 From FishC Mobile | 显示全部楼层
对于二维的切片,拷贝出来的是地址。
对于一维的切片,拷贝出来的是数据。
应该可以这么理解吧。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-9 00:34:05 From FishC Mobile | 显示全部楼层
我的第一条评论有个逻辑错误。见谅
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-12 16:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表