Static variables [was Re: syntax difference]

Ben Bacarisse ben.usenet at bsb.me.uk
Sat Jun 23 18:25:55 EDT 2018


Bart <bc at freeuk.com> writes:

> On 23/06/2018 21:13, Chris Angelico wrote:
>> On Sat, Jun 23, 2018 at 10:41 PM, Bart <bc at freeuk.com> wrote:
>
>>> (At what point would that happen anyway; if you do this:
>
>> NONE of your examples are taking copies of the function. They all are
>> making REFERENCES to the same function. That is all.
>
> This is about your notion that invocations of the same function via
> different references, should maintain their own versions of the
> function's 'static' data.
>
> Since these references are created via the return g statement here:
>
>     def f():
>         def g():
>             ....
>         return g
>
> (say to create function references i and j like this:
>
>     i = f()
>     j = f()
> )
>
> I'm assuming that something special must be happening. Otherwise, how
> does f() know which reference it's being called via?
>
> What is different, what extra bit of information is provided when f()
> is invoked via i() or j()?

f is not being invoked by either i() or j().  i = f() binds i to the
function returned by f.  That's a newly minted function.  In languages
like Python, executing def creates a function.  In your example, i and j
refer to different functions.  If the function temporarily named g has
"own" variables ("static" in C), then each such function should have its
own.  That was the point of the example much further up.

The effect can simulated like this:

def make_counter():
    def c():
        c.x += 1
        return c.x
    c.x = 0
    return c

i = make_counter()
j = make_counter()

print(i(), i(), j(), i())


-- 
Ben.



More information about the Python-list mailing list