default argument value is mutable
ast
nomail at com.invalid
Fri Oct 7 11:55:40 EDT 2016
"jmp" <jeanmichel at sequans.com> a écrit dans le message de
news:mailman.213.1475849391.30834.python-list at python.org...
> On 10/07/2016 03:45 PM, ast wrote:
>>
>> "jmp" <jeanmichel at sequans.com> a écrit dans le message de
>> news:mailman.210.1475844513.30834.python-list at python.org...
>>> On 10/07/2016 02:07 PM, ast wrote:
>>>>
>>>> "jmp" <jeanmichel at sequans.com> a écrit dans le message de
>>>> news:mailman.209.1475841371.30834.python-list at python.org...
>>>>> On 10/07/2016 01:38 PM, Daiyue Weng wrote:
>>>>
>>>>>
>>>>> So the rule of thumb for default argument value is "No mutable"
>>>>>
>>>>> Cheers,
>>>>
>>>>
>>>> It can be used to store some variables from one call of
>>>> a function to an other one.
>>>>
>>>> def test( _store={'x':0}):
>>>>
>>>> x = _store['x']
>>>> ..... do some stuff
>>>> _store['x'] = x
>>>
>>> For personal dirty scripts, possibly, for all other situations, never.
>>
>> not so dirty in my opinion
>
> You made a point, it's not that dirty, it's an "advanced technique" that is often actually an
> error when you don't know what you're doing. See the OP's code.
>
> I'm in an environment where people use python as a tool more than an effective powerful language
> to write complex applications. That's probably why I'm bias on this issue and prefer the cautious
> approach.
>
>>> Especially since there's nothing in the code above that cannot be
>>> solved using standard idioms .
>>
>> Yes, putting _store dictionnary outside
>>
>> _store={'x':0}
>>
>> def test( ):
>>
>> x = _store['x']
>> ..... do some stuff
>> _store['x'] = x
>>
>>
>> or using a global variable, but you pollute in both case
>> the global scope unnecessary.
>
> What about
>
> def test():
> if not hasattr(test, '_store'): test._store={'x':0}
> test._store['x'] += 1
>
> Neither you pollute the global namespace, nor you pollute the function signature with
> implementation specifics.
>
> jm
>
OK
There is this solution too we often see:
def test(x):
.... x = some stuff
.... return(x)
x=0
x = test(x)
More information about the Python-list
mailing list