找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 3274|回复: 8

[求助] list怎么会这样呢

5

主题

13

帖子

13

积分

贫民

积分
13
ssaxi 发表于 2017-7-3 11:02:24 | 显示全部楼层 |阅读模式
L=[1,2,1]
K=L
K[1]=L[0]+L[1]
在python里查看
输出 K=【1,3,1】,L=【1,3,1】
为什么L会发生变化呢?程序里并没有将K赋值给L的过程啊? 请教大家
回复

使用道具 举报

1

主题

28

帖子

28

积分

贫民

积分
28
cdbclx 发表于 2017-7-10 16:22:30 | 显示全部楼层
使用深拷贝:

>>> import copy
>>> a=[1,2,3]
>>> b=copy.deepcopy(a)
>>> b
[1, 2, 3]
>>> b[0]=11
>>> a
[1, 2, 3]
>>> b
[11, 2, 3]
回复 支持 1 反对 0

使用道具 举报

3

主题

278

帖子

278

积分

侠客

积分
278

热心会员

uitb 发表于 2017-7-3 12:18:25 | 显示全部楼层
LK都是指向同一内存地址的,也就是他们本身就是一个,L变了,K会跟着变,同样K变了L也会跟着变
回复 支持 反对

使用道具 举报

5

主题

13

帖子

13

积分

贫民

积分
13
ssaxi  楼主| 发表于 2017-7-3 13:02:42 | 显示全部楼层
uitb 发表于 2017-7-3 12:18
LK都是指向同一内存地址的,也就是他们本身就是一个,L变了,K会跟着变,同样K变了L也会跟着变 ...

那么K想复制L的内容应该怎么写呢
回复 支持 反对

使用道具 举报

3

主题

278

帖子

278

积分

侠客

积分
278

热心会员

uitb 发表于 2017-7-3 16:49:54 | 显示全部楼层
ssaxi 发表于 2017-7-3 13:02
那么K想复制L的内容应该怎么写呢

勉强可以用下面代码进行复制
  1. a = [1,2,3]
  2. b = []
  3. for i in a:
  4.     b.append(i)
复制代码

至于更好点的办法,你搜一下深浅拷贝的知识吧,我业余的,也没怎么看过。。。
QQ截图20170703164825.png
回复 支持 反对

使用道具 举报

3

主题

10

帖子

10

积分

贫民

积分
10
Charis 发表于 2017-7-3 23:48:54 | 显示全部楼层
楼主注意,在Python中,变量仅仅是指向对象的标签
a=[1,2,3]
然后b=a,这只是又创建了一个索引指向列表[1, 2, 3]
你这个时候可以查看两者的id——id(a)、id(b),你会发现他们的值是一样的
要正确的复制数组中的内容,你可以使用切片的方式
b=a[:],此时你再查看id你就会发现两者的id不一样了。
回复 支持 反对

使用道具 举报

5

主题

13

帖子

13

积分

贫民

积分
13
ssaxi  楼主| 发表于 2017-7-5 08:13:38 | 显示全部楼层
uitb 发表于 2017-7-3 16:49
勉强可以用下面代码进行复制

至于更好点的办法,你搜一下深浅拷贝的知识吧,我业余的,也没怎么看过。。 ...

谢谢你,辛苦了
回复 支持 反对

使用道具 举报

5

主题

13

帖子

13

积分

贫民

积分
13
ssaxi  楼主| 发表于 2017-7-5 08:14:34 | 显示全部楼层
Charis 发表于 2017-7-3 23:48
楼主注意,在Python中,变量仅仅是指向对象的标签
a=[1,2,3]
然后b=a,这只是又创建了一个索引指向列表[1,  ...

谢谢,这样更简洁。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

2

积分

贫民

积分
2
QQ
lbjyuer 发表于 2017-7-5 23:45:03 | 显示全部楼层
b=a[:] 结贴,撒花
回复 支持 反对

使用道具 举报

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

本版积分规则

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