作者StubbornLin (Victor)
看板Python
标题Re: [问题]一些观念的释疑?
时间Tue Sep 30 12:30:01 2008
※ 引述《tumc (HIHIHI)》之铭言:
: 想请问一些不太确定的问题
: 1.
: 若
: A = Aclass()
: B = A
: 则A是Aclass的instance本身?
: 或者A只是point到Aclass某个instance的变数?
: B确定只是一个pointer?
A和B都是指向Aclass instance的reference
(要讲pointer其实也可以 但感觉reference比较正确)
Python中的所有变数名称,都是reference
今天你设定一个变数
A = 1
就是产生一个值为1的实体,把A指向到此实体,接着又这样写
A = 2
就是产生一个值为2的实体,把A指向到此实体,那原本的1呢?
事实上1在此时可能还在,如果没有人指向它的话
过一阵子应该就会被回收掉了
而
A = 1
B = A
其实就是A和B都指向 1 这个物件的实体
如果说你不确定某个变数指向的实体到底和另一个一不一样
你可以用 id() 函数 印出它唯一的id来确认
或是
A is B 这样的式子
: ======
: 2.
: Linst=[]
: for inst in [Aclass(no=1),Aclass(no=2)... ]:
: Linst.append(inst)
: Pke_Linst = pickle.dumps(Linst)
: 想请问的是Pke_Linst打包起来的是一个Aclass instance的串列?
: 或者只是一堆pointer的串列?
pickle有一个机制可以自动帮你打包大部份的物件
甚至是你自己写的物件,虽然说变数都是reference
可是pickle会帮你自动去做处理 你也可以改写某些特别的方法
来针对pickle行为特化的样子 不知道有没有记错
一般而言大部份常见的物件物资料结构都可以被pickle
但有些就不能,例如open('xxx.txt', 'rt')这类的物件
当然就无法pickle
一个测试的方法,就是你把pickle出来的东西存成档案
关掉python程式,再次执行然後load进来
不过有些东西虽然可以被pickle,但是遇到太深的结构
会有呼叫堆叠溢出的问题,像我之前用BeautifulSoup所产生的物件
进行pickle,某些网页就会发生这种问题
我有大概看过它原始码,pickle是用递回写的,所以如果走访过深的话就会堆叠溢出
--
易记学 程式设计教学
http://ez2learn.com/
易记学 程式设计讨论区
http://forum.ez2learn.com
VICTOR's 个人Blog
http://blog.ez2learn.com/
财报分析王
http://victorlin.serveftp.org/stock/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.170.87.108
1F:→ rexrainbow:"B = A" 还可以在分得更细, 例如A=0 及 A=[0] 09/30 13:09
2F:→ StubbornLin:嗯 可改变和不可改变 09/30 13:50