简体   繁体   中英

do not understand closures question in python

def a(b=[]):
    b.append(1)
    return b

print a()
print a()

All of a sudden i got a list with 2 elems, but how? Shouldn't b be getting set to empty list every time.

Thanks for the help

Default arguments are only evaluated once, when the function is defined. It retains the same object from one invocation to the next, which means that the same list keeps getting appended to. Use a default value of None and check for that instead if you want to get around this.

Nothing to do with closures, at least not in the usual sense.

The default value for b is not "a new empty list"; it is "this particular object which I just created right now while defining the function, initializing it to be an empty list". Every time the function is called without an argument, the same object is used.

The corrected version, for the reasons given in other answers, is:

def a(b=None):
    b = [] if b is None else b

    b.append(1)
    return b

default arguments are evaluated (once) when the function is defined, not each time it is called.

try this:

def a(b=None):
    if b is None
        b = []     
    b.append(1)
    return b

print a()
print a()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM