Steven D'Aprano <[EMAIL PROTECTED]> writes:
> On Mon, 18 Aug 2008 03:20:11 -0700, Jasper wrote:
> "And no, the alternative /does not/ have an equivalent set of surprises
> -- it's not like Python is unique in having default arguments."
>
> That's simply not true. I would find this behaviour very surprising, and
> I bet you would too:
>
>>>> x = "parrot"
>>>> def foo(obj=x):
> ... print obj
> ...
>>>> foo() # this is the current behaviour
> parrot
>>>> x = "shrubbery"
>>>> foo() # but this is not
> shrubbery
>>>> del x
>>>> foo() # nor is this
> Traceback (most recent call last):
> NameError: name 'x' is not defined
You may find the above surprising, but Common Lisp users expect the default
argument expression to be evaluated anew when need by a function call:
* (defvar *x* "parrot")
*X*
* (defun foo (&optional (obj *x*)) ;; optional arg, default is *x*
obj)
FOO
* (foo)
"parrot"
* (setf *x* "shrubbery")
"shrubbery"
* (foo)
"shrubbery"
* (makunbound '*x*)
*X*
* (foo)
debugger invoked on a UNBOUND-VARIABLE in thread #<THREAD "initial thread"
RUNNING {10023EDE81}>:
The variable *X* is unbound.
I find the Lisp approach more reasonable. Also, an argument based on
performance for Python's current behavior seems dubious, given the
language's other performance robbing design choices.
bob
--
http://mail.python.org/mailman/listinfo/python-list