zljubi...@gmail.com wrote: > Hi, > > consider this example: > > from typing import Dict, List > > > class chk_params: > def execute(self, params: Dict[str, List] = None): > if params is None: > params = {} > > for k, v in params.items(): > params[k] = [val + 10 for val in v] > > return params.values() > > params = { > 'A' : [1], > 'B': [2], > 'C': [3], > 'D': [4], > 'E': [5] > } > print(params) > params_obj = chk_params() > > print(params_obj.execute(params = params)) > print(params) > > Output is: > {'A': [1], 'B': [2], 'C': [3], 'D': [4], 'E': [5]} > dict_values([[11], [12], [13], [14], [15]]) > {'A': [11], 'B': [12], 'C': [13], 'D': [14], 'E': [15]} > > I expected that last print statement will show original parameters A=1, > B=2... but this is not the case. > > How to construct the method parameters, with params parameter as type of > Dict[str, List], but at the same time keep params as local dictionary to > the chk_params.execute() method?
The type annotations are only a distraction here; let's give classical Python a chance with - no type annotations - no class - dangerous default, for the thrill of it;) def execute(params={}): return [[val + 10 for val in v] for v in params.values()] Clean and simple. If you insist on getting dict_values(): def execute(params={}): return {k: [val + 10 for val in v] for k, v in params.items()}.values() The relevant takeaway is: if you don't want to modify a value, don't modify it. Do not wait for a const modifier to save you. -- https://mail.python.org/mailman/listinfo/python-list