David C. Ullrich wrote:
In article <[EMAIL PROTECTED]>,
 ssecorp <[EMAIL PROTECTED]> wrote:

I am never redefining the or reassigning the list when using validate
but since it spits the modified list back out that somehow means that
the modified list is part of the environment and not the old one.
i thought what happend inside a function stays inside a function
meaning what comes out is independent of what comes in.
Meaning if I want the list I send as a parameter to the function I
have to do x = func(x) and not just func(x) and x is magically what
comes out of func().

A function cannot modify the value of a global variable

Yes it can.
>>> a=[]
>>> def f():
        a.append('yes I can')

>>> f()
>>> a
['yes I can']

(unless it specifies "global"). It doesn't reassign anything.

The statement 'global a' would allow f to *rebind* the global *name* 'a'. The word 'variable' should almost not be used in discussing Python since it is often unclear whether it refers to a name (or collection slot) or an object bound thereto.

But in the functions below you're not reassigning a variable,
you're _modifiying_ an object. A function _can_ modify an
object you pass to it:

It can modify any mutable object it can access.

Doesnt Python have closure or that isnt what this is about?

Python does have closures.  This is not about that.

def validate(placed):
    student = round(random.random()*401)
    if student in placed:
        return validate(placed)
    else:
        placed.append(student)
        return student, placed

Delete this. It is redundant with the below.

def val(placed):
    student = round(random.random()*401)
    if student in placed:
        return validate(placed)
    else:
        placed.append(student)
        return student

I believe this is equivalent to

def addval(placed):
  while True:
    student = round(random.random()*401)
    if student not in placed:
      break
  placed.append(student)
  return student

While this avoids the indefinite recursion depth problem, it does not avoid the indefinite time problem. Use random.shuffle, or write your own version if doing this for practice. Also consider removing the return statement unless you actually directly use the added value. It is easier to remember that addval mutates 'placed' without the return.

g = lambda x:validate(x)

This is doubly diseased.

First, never write a 'name = lambda...' statement since it is equivalent to a def statement except that the resulting function object lacks a proper .funcname attribute. The above only trivially abbreviates
  def g(x): return validate(x)
by 3 characters. Another reason is that the lambda form somehow more often tricks people into the next mistake .

Second, never write a function (with either def or lambda) that simply returns a function of the argument(s). The wrapping does nothing! This is a waste of time and space for both you and the interpreter. The above is functionally equivalent to
  g = validate
and if you want that, you could name the function 'g' when you define it.

l=[]
In some fonts, 'l' and '1' are nearly identical; please use something else for public code, which you made this to be by posting it;-)

for x in range(1,10):
        g(l)
As said, the 'g' wrapper is useless.
       addval(l)

Hope this helps.

Terry Jan Reedy

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to