Concatenation of the result of a function with a mutable default argument in pythonCalling a function of a module by using its name (a string)“Least Astonishment” and the Mutable Default ArgumentHow do I concatenate two lists in Python?Good uses for mutable function argument default values?Instantiation time for mutable default arguments of closures in PythonWarning about mutable default argument in PyCharmFunctions with mutable default values

What is the hex versus octal timeline?

How to dismiss intrusive questions from a colleague with whom I don't work?

How is "sein" conjugated in this sub-sentence?

Is there any practical application for performing a double Fourier transform? ...or an inverse Fourier transform on a time-domain input?

Why is my Earth simulation slower than the reality?

Vacuum collapse -- why do strong metals implode but glass doesn't?

How should I face my manager if I make a mistake because a senior coworker explained something incorrectly to me?

Why is observed clock rate < 3MHz on Arduino Uno?

Potential new partner angry about first collaboration - how to answer email to close up this encounter in a graceful manner

Is there a limit on how long the casting (speaking aloud part of the spell) of Wish can be?

Avoiding racist tropes in fantasy

Efficiently pathfinding many flocking enemies around obstacles

Why aren't RCS openings an issue for spacecraft heat shields?

How to write triplets in 4/4 time without using a 3 on top of the notes all the time

Why didn’t Doctor Strange stay in the original winning timeline?

Why can't an Airbus A330 dump fuel in an emergency?

map 5 unequal ranges to id

Most practical knots for hitching a line to an object while keeping the bitter end as tight as possible, without sag?

System to validate run time complexity requirements

Fancy String Replace

How can I watch the 17th (or last, if less) line in files of a folder?

Is it best to use a tie when using 8th notes off the beat?

Is it insecure to have an ansible user with passwordless sudo?

How to persuade recruiters to send me the Job Description?



Concatenation of the result of a function with a mutable default argument in python


Calling a function of a module by using its name (a string)“Least Astonishment” and the Mutable Default ArgumentHow do I concatenate two lists in Python?Good uses for mutable function argument default values?Instantiation time for mutable default arguments of closures in PythonWarning about mutable default argument in PyCharmFunctions with mutable default values






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








17















Suppose a function with a mutable default argument:



def f(l=[]):
l.append(len(l))
return l


If I run this:



def f(l=[]):
l.append(len(l))
return l
print(f()+["-"]+f()+["-"]+f()) # -> [0, '-', 0, 1, '-', 0, 1, 2]


If I run this:



def f(l=[]):
l.append(len(l))
return l
print(f()+f()+f()) # -> [0, 1, 0, 1, 0, 1, 2]


Instead of this, which would be more logical:



print(f()+f()+f()) # -> [0, 0, 1, 0, 1, 2]


Why ?










share|improve this question


























  • if you want to see the result of individual functional call then use return [l.copy()]

    – prashant rana
    9 hours ago











  • Well the last funciont returns me this: [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5]

    – Celius Stingher
    9 hours ago











  • @CeliusStingher You have to redefine the function between uses.

    – Benoît Pilatte
    9 hours ago











  • with - you will be able to distinguish between your data from each functional call , in second one you need to write a code to get the pattern

    – prashant rana
    9 hours ago

















17















Suppose a function with a mutable default argument:



def f(l=[]):
l.append(len(l))
return l


If I run this:



def f(l=[]):
l.append(len(l))
return l
print(f()+["-"]+f()+["-"]+f()) # -> [0, '-', 0, 1, '-', 0, 1, 2]


If I run this:



def f(l=[]):
l.append(len(l))
return l
print(f()+f()+f()) # -> [0, 1, 0, 1, 0, 1, 2]


Instead of this, which would be more logical:



print(f()+f()+f()) # -> [0, 0, 1, 0, 1, 2]


Why ?










share|improve this question


























  • if you want to see the result of individual functional call then use return [l.copy()]

    – prashant rana
    9 hours ago











  • Well the last funciont returns me this: [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5]

    – Celius Stingher
    9 hours ago











  • @CeliusStingher You have to redefine the function between uses.

    – Benoît Pilatte
    9 hours ago











  • with - you will be able to distinguish between your data from each functional call , in second one you need to write a code to get the pattern

    – prashant rana
    9 hours ago













17












17








17


1






Suppose a function with a mutable default argument:



def f(l=[]):
l.append(len(l))
return l


If I run this:



def f(l=[]):
l.append(len(l))
return l
print(f()+["-"]+f()+["-"]+f()) # -> [0, '-', 0, 1, '-', 0, 1, 2]


If I run this:



def f(l=[]):
l.append(len(l))
return l
print(f()+f()+f()) # -> [0, 1, 0, 1, 0, 1, 2]


Instead of this, which would be more logical:



print(f()+f()+f()) # -> [0, 0, 1, 0, 1, 2]


Why ?










share|improve this question
















Suppose a function with a mutable default argument:



def f(l=[]):
l.append(len(l))
return l


If I run this:



def f(l=[]):
l.append(len(l))
return l
print(f()+["-"]+f()+["-"]+f()) # -> [0, '-', 0, 1, '-', 0, 1, 2]


If I run this:



def f(l=[]):
l.append(len(l))
return l
print(f()+f()+f()) # -> [0, 1, 0, 1, 0, 1, 2]


Instead of this, which would be more logical:



print(f()+f()+f()) # -> [0, 0, 1, 0, 1, 2]


Why ?







python python-3.x






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 9 hours ago







Benoît Pilatte

















asked 9 hours ago









Benoît PilatteBenoît Pilatte

1,6274 silver badges23 bronze badges




1,6274 silver badges23 bronze badges















  • if you want to see the result of individual functional call then use return [l.copy()]

    – prashant rana
    9 hours ago











  • Well the last funciont returns me this: [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5]

    – Celius Stingher
    9 hours ago











  • @CeliusStingher You have to redefine the function between uses.

    – Benoît Pilatte
    9 hours ago











  • with - you will be able to distinguish between your data from each functional call , in second one you need to write a code to get the pattern

    – prashant rana
    9 hours ago

















  • if you want to see the result of individual functional call then use return [l.copy()]

    – prashant rana
    9 hours ago











  • Well the last funciont returns me this: [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5]

    – Celius Stingher
    9 hours ago











  • @CeliusStingher You have to redefine the function between uses.

    – Benoît Pilatte
    9 hours ago











  • with - you will be able to distinguish between your data from each functional call , in second one you need to write a code to get the pattern

    – prashant rana
    9 hours ago
















if you want to see the result of individual functional call then use return [l.copy()]

– prashant rana
9 hours ago





if you want to see the result of individual functional call then use return [l.copy()]

– prashant rana
9 hours ago













Well the last funciont returns me this: [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5]

– Celius Stingher
9 hours ago





Well the last funciont returns me this: [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5]

– Celius Stingher
9 hours ago













@CeliusStingher You have to redefine the function between uses.

– Benoît Pilatte
9 hours ago





@CeliusStingher You have to redefine the function between uses.

– Benoît Pilatte
9 hours ago













with - you will be able to distinguish between your data from each functional call , in second one you need to write a code to get the pattern

– prashant rana
9 hours ago





with - you will be able to distinguish between your data from each functional call , in second one you need to write a code to get the pattern

– prashant rana
9 hours ago












1 Answer
1






active

oldest

votes


















19













That's actually pretty interesting!



As we know, the list l in the function definition is initialized only once at the definition of this function, and for all invocations of this function, there will be exactly one copy of this list. Now, the function modifies this list, which means that multiple calls to this function will modify the exact same object multiple times. This is the first important part.



Now, consider the expression that adds these lists:



f()+f()+f()


According to the laws of operator precedence, this is equivalent to the following:



(f() + f()) + f()


...which is exactly the same as this:



temp1 = f() + f() # (1)
temp2 = temp1 + f() # (2)


This is the second important part.



Addition of lists produces a new object, without modifying any of its arguments. This is the third important part.



Now let's combine what we know together.



In line 1 above, the first call returns [0], as you'd expect. The second call returns [0, 1], as you'd expect. Oh, wait! The function will return the exact same object (not its copy!) over and over again, after modifying it! This means that the object that the first call returned has now changed to become [0, 1] as well! And that's why temp1 == [0, 1] + [0, 1].



The result of addition, however, is a completely new object, so [0, 1, 0, 1] + f() is the same as [0, 1, 0, 1] + [0, 1, 2]. Note that the second list is, again, exactly what you'd expect your function to return. The same thing happens when you add f() + ["-"]: this creates a new list object, so that any other calls to f won't interfere with it.



You can reproduce this by concatenating the results of two function calls:



>>> f() + f()
[0, 1, 0, 1]
>>> f() + f()
[0, 1, 2, 3, 0, 1, 2, 3]
>>> f() + f()
[0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5]


Again, you can do all that because you're concatenating references to the same object.






share|improve this answer



























  • Wow, 🤯. The best thing about this answer is that it is right. []+f()+f() gives [0, 0, 1] and f()+f()+[] gives [0, 1, 0, 1] !!!

    – Benoît Pilatte
    9 hours ago







  • 2





    The new object returned by + is definitely the key here, it's so subtle

    – C.Nivs
    9 hours ago






  • 1





    A good reminder for why a mutable default argument is a big no-no.

    – EliadL
    9 hours ago






  • 2





    Looked into dis(lambda: f()+f()+f()) and the function f did get called twice before add is performed. Great answer btw.

    – Henry Yik
    8 hours ago






  • 1





    @HenryYik it's because of how list.__add__ is implemented. The first f() instantiates the list object, let's call it l1. Then l1.__add__(f()) is called, so, f() needs to be evaluated first, which changes the reference that is shared with l1. Then l1.__add__(l2) finishes, returning the new object.

    – C.Nivs
    8 hours ago










Your Answer






StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");

StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);













draft saved

draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f57593294%2fconcatenation-of-the-result-of-a-function-with-a-mutable-default-argument-in-pyt%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









19













That's actually pretty interesting!



As we know, the list l in the function definition is initialized only once at the definition of this function, and for all invocations of this function, there will be exactly one copy of this list. Now, the function modifies this list, which means that multiple calls to this function will modify the exact same object multiple times. This is the first important part.



Now, consider the expression that adds these lists:



f()+f()+f()


According to the laws of operator precedence, this is equivalent to the following:



(f() + f()) + f()


...which is exactly the same as this:



temp1 = f() + f() # (1)
temp2 = temp1 + f() # (2)


This is the second important part.



Addition of lists produces a new object, without modifying any of its arguments. This is the third important part.



Now let's combine what we know together.



In line 1 above, the first call returns [0], as you'd expect. The second call returns [0, 1], as you'd expect. Oh, wait! The function will return the exact same object (not its copy!) over and over again, after modifying it! This means that the object that the first call returned has now changed to become [0, 1] as well! And that's why temp1 == [0, 1] + [0, 1].



The result of addition, however, is a completely new object, so [0, 1, 0, 1] + f() is the same as [0, 1, 0, 1] + [0, 1, 2]. Note that the second list is, again, exactly what you'd expect your function to return. The same thing happens when you add f() + ["-"]: this creates a new list object, so that any other calls to f won't interfere with it.



You can reproduce this by concatenating the results of two function calls:



>>> f() + f()
[0, 1, 0, 1]
>>> f() + f()
[0, 1, 2, 3, 0, 1, 2, 3]
>>> f() + f()
[0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5]


Again, you can do all that because you're concatenating references to the same object.






share|improve this answer



























  • Wow, 🤯. The best thing about this answer is that it is right. []+f()+f() gives [0, 0, 1] and f()+f()+[] gives [0, 1, 0, 1] !!!

    – Benoît Pilatte
    9 hours ago







  • 2





    The new object returned by + is definitely the key here, it's so subtle

    – C.Nivs
    9 hours ago






  • 1





    A good reminder for why a mutable default argument is a big no-no.

    – EliadL
    9 hours ago






  • 2





    Looked into dis(lambda: f()+f()+f()) and the function f did get called twice before add is performed. Great answer btw.

    – Henry Yik
    8 hours ago






  • 1





    @HenryYik it's because of how list.__add__ is implemented. The first f() instantiates the list object, let's call it l1. Then l1.__add__(f()) is called, so, f() needs to be evaluated first, which changes the reference that is shared with l1. Then l1.__add__(l2) finishes, returning the new object.

    – C.Nivs
    8 hours ago















19













That's actually pretty interesting!



As we know, the list l in the function definition is initialized only once at the definition of this function, and for all invocations of this function, there will be exactly one copy of this list. Now, the function modifies this list, which means that multiple calls to this function will modify the exact same object multiple times. This is the first important part.



Now, consider the expression that adds these lists:



f()+f()+f()


According to the laws of operator precedence, this is equivalent to the following:



(f() + f()) + f()


...which is exactly the same as this:



temp1 = f() + f() # (1)
temp2 = temp1 + f() # (2)


This is the second important part.



Addition of lists produces a new object, without modifying any of its arguments. This is the third important part.



Now let's combine what we know together.



In line 1 above, the first call returns [0], as you'd expect. The second call returns [0, 1], as you'd expect. Oh, wait! The function will return the exact same object (not its copy!) over and over again, after modifying it! This means that the object that the first call returned has now changed to become [0, 1] as well! And that's why temp1 == [0, 1] + [0, 1].



The result of addition, however, is a completely new object, so [0, 1, 0, 1] + f() is the same as [0, 1, 0, 1] + [0, 1, 2]. Note that the second list is, again, exactly what you'd expect your function to return. The same thing happens when you add f() + ["-"]: this creates a new list object, so that any other calls to f won't interfere with it.



You can reproduce this by concatenating the results of two function calls:



>>> f() + f()
[0, 1, 0, 1]
>>> f() + f()
[0, 1, 2, 3, 0, 1, 2, 3]
>>> f() + f()
[0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5]


Again, you can do all that because you're concatenating references to the same object.






share|improve this answer



























  • Wow, 🤯. The best thing about this answer is that it is right. []+f()+f() gives [0, 0, 1] and f()+f()+[] gives [0, 1, 0, 1] !!!

    – Benoît Pilatte
    9 hours ago







  • 2





    The new object returned by + is definitely the key here, it's so subtle

    – C.Nivs
    9 hours ago






  • 1





    A good reminder for why a mutable default argument is a big no-no.

    – EliadL
    9 hours ago






  • 2





    Looked into dis(lambda: f()+f()+f()) and the function f did get called twice before add is performed. Great answer btw.

    – Henry Yik
    8 hours ago






  • 1





    @HenryYik it's because of how list.__add__ is implemented. The first f() instantiates the list object, let's call it l1. Then l1.__add__(f()) is called, so, f() needs to be evaluated first, which changes the reference that is shared with l1. Then l1.__add__(l2) finishes, returning the new object.

    – C.Nivs
    8 hours ago













19












19








19







That's actually pretty interesting!



As we know, the list l in the function definition is initialized only once at the definition of this function, and for all invocations of this function, there will be exactly one copy of this list. Now, the function modifies this list, which means that multiple calls to this function will modify the exact same object multiple times. This is the first important part.



Now, consider the expression that adds these lists:



f()+f()+f()


According to the laws of operator precedence, this is equivalent to the following:



(f() + f()) + f()


...which is exactly the same as this:



temp1 = f() + f() # (1)
temp2 = temp1 + f() # (2)


This is the second important part.



Addition of lists produces a new object, without modifying any of its arguments. This is the third important part.



Now let's combine what we know together.



In line 1 above, the first call returns [0], as you'd expect. The second call returns [0, 1], as you'd expect. Oh, wait! The function will return the exact same object (not its copy!) over and over again, after modifying it! This means that the object that the first call returned has now changed to become [0, 1] as well! And that's why temp1 == [0, 1] + [0, 1].



The result of addition, however, is a completely new object, so [0, 1, 0, 1] + f() is the same as [0, 1, 0, 1] + [0, 1, 2]. Note that the second list is, again, exactly what you'd expect your function to return. The same thing happens when you add f() + ["-"]: this creates a new list object, so that any other calls to f won't interfere with it.



You can reproduce this by concatenating the results of two function calls:



>>> f() + f()
[0, 1, 0, 1]
>>> f() + f()
[0, 1, 2, 3, 0, 1, 2, 3]
>>> f() + f()
[0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5]


Again, you can do all that because you're concatenating references to the same object.






share|improve this answer















That's actually pretty interesting!



As we know, the list l in the function definition is initialized only once at the definition of this function, and for all invocations of this function, there will be exactly one copy of this list. Now, the function modifies this list, which means that multiple calls to this function will modify the exact same object multiple times. This is the first important part.



Now, consider the expression that adds these lists:



f()+f()+f()


According to the laws of operator precedence, this is equivalent to the following:



(f() + f()) + f()


...which is exactly the same as this:



temp1 = f() + f() # (1)
temp2 = temp1 + f() # (2)


This is the second important part.



Addition of lists produces a new object, without modifying any of its arguments. This is the third important part.



Now let's combine what we know together.



In line 1 above, the first call returns [0], as you'd expect. The second call returns [0, 1], as you'd expect. Oh, wait! The function will return the exact same object (not its copy!) over and over again, after modifying it! This means that the object that the first call returned has now changed to become [0, 1] as well! And that's why temp1 == [0, 1] + [0, 1].



The result of addition, however, is a completely new object, so [0, 1, 0, 1] + f() is the same as [0, 1, 0, 1] + [0, 1, 2]. Note that the second list is, again, exactly what you'd expect your function to return. The same thing happens when you add f() + ["-"]: this creates a new list object, so that any other calls to f won't interfere with it.



You can reproduce this by concatenating the results of two function calls:



>>> f() + f()
[0, 1, 0, 1]
>>> f() + f()
[0, 1, 2, 3, 0, 1, 2, 3]
>>> f() + f()
[0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5]


Again, you can do all that because you're concatenating references to the same object.







share|improve this answer














share|improve this answer



share|improve this answer








edited 5 hours ago

























answered 9 hours ago









ForceBruForceBru

24.7k9 gold badges36 silver badges62 bronze badges




24.7k9 gold badges36 silver badges62 bronze badges















  • Wow, 🤯. The best thing about this answer is that it is right. []+f()+f() gives [0, 0, 1] and f()+f()+[] gives [0, 1, 0, 1] !!!

    – Benoît Pilatte
    9 hours ago







  • 2





    The new object returned by + is definitely the key here, it's so subtle

    – C.Nivs
    9 hours ago






  • 1





    A good reminder for why a mutable default argument is a big no-no.

    – EliadL
    9 hours ago






  • 2





    Looked into dis(lambda: f()+f()+f()) and the function f did get called twice before add is performed. Great answer btw.

    – Henry Yik
    8 hours ago






  • 1





    @HenryYik it's because of how list.__add__ is implemented. The first f() instantiates the list object, let's call it l1. Then l1.__add__(f()) is called, so, f() needs to be evaluated first, which changes the reference that is shared with l1. Then l1.__add__(l2) finishes, returning the new object.

    – C.Nivs
    8 hours ago

















  • Wow, 🤯. The best thing about this answer is that it is right. []+f()+f() gives [0, 0, 1] and f()+f()+[] gives [0, 1, 0, 1] !!!

    – Benoît Pilatte
    9 hours ago







  • 2





    The new object returned by + is definitely the key here, it's so subtle

    – C.Nivs
    9 hours ago






  • 1





    A good reminder for why a mutable default argument is a big no-no.

    – EliadL
    9 hours ago






  • 2





    Looked into dis(lambda: f()+f()+f()) and the function f did get called twice before add is performed. Great answer btw.

    – Henry Yik
    8 hours ago






  • 1





    @HenryYik it's because of how list.__add__ is implemented. The first f() instantiates the list object, let's call it l1. Then l1.__add__(f()) is called, so, f() needs to be evaluated first, which changes the reference that is shared with l1. Then l1.__add__(l2) finishes, returning the new object.

    – C.Nivs
    8 hours ago
















Wow, 🤯. The best thing about this answer is that it is right. []+f()+f() gives [0, 0, 1] and f()+f()+[] gives [0, 1, 0, 1] !!!

– Benoît Pilatte
9 hours ago






Wow, 🤯. The best thing about this answer is that it is right. []+f()+f() gives [0, 0, 1] and f()+f()+[] gives [0, 1, 0, 1] !!!

– Benoît Pilatte
9 hours ago





2




2





The new object returned by + is definitely the key here, it's so subtle

– C.Nivs
9 hours ago





The new object returned by + is definitely the key here, it's so subtle

– C.Nivs
9 hours ago




1




1





A good reminder for why a mutable default argument is a big no-no.

– EliadL
9 hours ago





A good reminder for why a mutable default argument is a big no-no.

– EliadL
9 hours ago




2




2





Looked into dis(lambda: f()+f()+f()) and the function f did get called twice before add is performed. Great answer btw.

– Henry Yik
8 hours ago





Looked into dis(lambda: f()+f()+f()) and the function f did get called twice before add is performed. Great answer btw.

– Henry Yik
8 hours ago




1




1





@HenryYik it's because of how list.__add__ is implemented. The first f() instantiates the list object, let's call it l1. Then l1.__add__(f()) is called, so, f() needs to be evaluated first, which changes the reference that is shared with l1. Then l1.__add__(l2) finishes, returning the new object.

– C.Nivs
8 hours ago





@HenryYik it's because of how list.__add__ is implemented. The first f() instantiates the list object, let's call it l1. Then l1.__add__(f()) is called, so, f() needs to be evaluated first, which changes the reference that is shared with l1. Then l1.__add__(l2) finishes, returning the new object.

– C.Nivs
8 hours ago








Got a question that you can’t ask on public Stack Overflow? Learn more about sharing private information with Stack Overflow for Teams.







Got a question that you can’t ask on public Stack Overflow? Learn more about sharing private information with Stack Overflow for Teams.



















draft saved

draft discarded
















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid


  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f57593294%2fconcatenation-of-the-result-of-a-function-with-a-mutable-default-argument-in-pyt%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Sahara Skak | Bilen | Luke uk diar | NawigatsjuunCommonskategorii: SaharaWikivoyage raisfeerer: Sahara26° N, 13° O

The fall designs the understood secretary. Looking glass Science Shock Discovery Hot Everybody Loves Raymond Smile 곳 서비스 성실하다 Defas Kaloolon Definition: To combine or impregnate with sulphur or any of its compounds as to sulphurize caoutchouc in vulcanizing Flame colored Reason Useful Thin Help 갖다 유명하다 낙엽 장례식 Country Iron Definition: A fencer a gladiator one who exhibits his skill in the use of the sword Definition: The American black throated bunting Spiza Americana Nostalgic Needy Method to my madness 시키다 평가되다 전부 소설가 우아하다 Argument Tin Feeling Representative Gym Music Gaur Chicken 일쑤 코치 편 학생증 The harbor values the sugar. Vasagle Yammoe Enstatite Definition: Capable of being limited Road Neighborly Five Refer Built Kangaroo 비비다 Degree Release Bargain Horse 하루 형님 유교 석 동부 괴롭히다 경제력

19. јануар Садржај Догађаји Рођења Смрти Празници и дани сећања Види још Референце Мени за навигацијуу