作者sbrhsieh (sbr)
看板Python
标题Re: [问题] default value for arguments..
时间Wed Jan 28 14:27:08 2009
※ 引述《yungyuc (酷狗喵千代)》之铭言:
: ※ 引述《dimen (一人吃二人补)》之铭言:
: : hi, all:
: : 我在国外的某个blog上看到一篇文章:
: : http://tinyurl.com/8t73xp
: : 里面的一段程式码:
: : ... def __init__(self, name='', stuff=[]):
: Python 在定义函式/方法的时候会进行评估 (evaluation)
: stuff=[] 中的 [] 等同於 list(),会建立一个 list 的实体
: 然後这个 list 实体再指定给 stuff 变数 (在此为函式参数)
: : ... self.name = name
: : ... self.stuff = stuff
: stuff 参数所指涉的 list 物件又被指定给 self.stuff
: 但注意,都是同一个 list 实体
: : ...
: : ... def add_stuff(self, gadget):
: : ... self.stuff.append(gadget)
: : ...
: : ['tree']
: : ['tree']
: 如果再加一行 f.stuff == g.stuff,你会发现此表达式为真
: 为什麽?因为在 Foo 类别的 constructor (Foo.__init__) 中
: self.stuff 是被指定给「同一个 list 实体」
: 该 list 实体是在定义 Foo.__init__ 的时候就建出来的
这里应该使用 is operator 才证明两者是同一个物件。
f.stuff is g.stuff
: : 这结果跟我之前学的OOP有些不同..没实际执行一次,我会以为g.stuff应该是[]
: 这和 OOP 完全无关,而是 Python 评估 function/method definition 的特性使然
这个例子可以强调 Python 只有 statement 没有 declaration 的特性。
def __init__(self, name='', stuff=[]):
self.name = name
self.stuff = stuff
上述这个 def statement 执行完成後产生了一个 function object,bind 在
class namespace 中的 "__init__" 名称;这个 function object construction
过程只有发生一次,所以 stuff=[] 这个 expression 也只 evaluate 一次,而
不是每次此 function 被执行时都 evaluate 一次。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.173.133.197
1F:推 yungyuc:我错了,要用 is 而非 == :) 01/28 20:21
2F:推 dimen:感谢大家的回覆,我再来研究看看 01/29 00:58
3F:推 rofu:可以用id(g.stuff) and id(g.stuff)来看object的位置是否一样 01/29 02:55