关于 python list 赋值的一个问题!

2016-05-08 18:46:51 +08:00
 niuoh

看图!

给个解释啊...

3387 次点击
所在节点    Python
17 条回复
kendetrics
2016-05-08 18:53:59 +08:00
赋值赋过去的是入口地址呗,有啥难理解的
想要克隆 a 的内存用 b = a[:] 就行了
niuoh
2016-05-08 19:00:10 +08:00
@kendetrics 原来如此
flyaway
2016-05-08 19:02:01 +08:00
Python 中全是引用……
niuoh
2016-05-08 19:03:49 +08:00
@kendetrics 那 字典 怎么克隆内存而不是引用啊
kendetrics
2016-05-08 19:08:13 +08:00
@niuoh b = dict(a) 多用用搜索引擎,兄弟
Allianzcortex
2016-05-08 19:09:00 +08:00
Python 的内存机制是引用计数。对 a=[1,2,3],实际上是在内存里有一个 [1,2,3],然后增添一个引用, reference_count+1,指向 a;

b=a,则 [1,2,3] 的 reference_count 再+1,指向 b

b.remove(1) 修改的是它所指向的对象:由[1,2,3]变为[2,3];而 a 和 b 指向的是同一个元素,都显示[2,3]

---

顺便说一下  @kendetrics 的拷贝是怎么回事

Python 里有两种拷贝方式, shallow copy 和 deep copy

如果你想 a 和 b 完全隔离开,用这种方式:
import copy
b=copy.deepcopy(a)

如果你用 b=a[:] 这种方式,实际上还是浅拷贝,和 b=list(a) 工厂函数效果是一样的。

这样的话用 b.remove(1) ,a 不受影响;这是因为 a,b 里面都是数字,是 immutable 不可变对象;

如果这样,a=[1,2,[3,4]],b=a[:],你修改 a[2].append(5),则 a=[1,2,[3,4,5]],b 也同样变化, b=[1,2,[3,4,5]],因为 a[2]是一个 list,是 mutable  可变对象
niuoh
2016-05-08 19:09:24 +08:00
@kendetrics 我觉得这里比搜索引擎好用! 哈哈
Allianzcortex
2016-05-08 19:10:42 +08:00
我觉得我已经把这一块讲完了……其他的部分 LZ 自己去 SO 搜吧

擦……为什么是这种拍板,空格怎么变的这么大
niuoh
2016-05-08 19:11:38 +08:00
@Allianzcortex 看完了 真·大神
Allianzcortex
2016-05-08 19:12:50 +08:00
@ niuoh 这种问题没有比 SO 讲的更好的。实际上这是伸手党问题。说的不好听,这是对自己和别人时间的不负责任。我要不是实在论文写不下去了是不会回复的
hxndg
2016-05-08 19:18:57 +08:00
@niuoh 真心建议自己搜索。。。从我个人经验来说,搜了很久没搜到再来问茅塞顿开的效果比直接问好得多。
zqhong
2016-05-08 19:24:54 +08:00
问题一: python list 赋值的一个问题
用 Python 中的内置函数 id 很容易理解。




===

问题二:字典怎么克隆内存而不是引用
使用 Python 中的 标准库 - copy
https://docs.python.org/2/library/copy.html



===

关于这方面,可以再试试搜索: Python 浅拷贝 深拷贝(英文: Python deep copy shallow copy )

推荐阅读:
http://stackoverflow.com/questions/17246693/what-exactly-is-the-difference-between-shallow-copy-deepcopy-and-normal-assignm
zqhong
2016-05-08 19:29:33 +08:00
第二个图发错了。

图二:


我也同意实在没办法再问别人。
Allianzcortex
2016-05-08 19:38:20 +08:00
@zqhong dict 自带 copy ,可以考虑用 d2=d1.copy()~

如果要完全分离的话,或者避免在原地址上操作,或者用 deepcopy ……
zqhong
2016-05-08 19:51:38 +08:00
@Allianzcortex 谢谢建议!野生的 Python 选手,还有很多要学些呀~
Allianzcortex
2016-05-08 19:55:00 +08:00
@zqhong 大家都是野生程序猿 2333
alexapollo
2016-05-09 00:18:16 +08:00
@Allianzcortex 解答的好详细,以前我也遇到过这个问题,一直没有深究

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/277156

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX