Размещение new также очень полезно при сериализации (скажем, с boost :: serialization). В 10 лет c ++ это только второй случай, когда мне нужно новое место для размещения (третий, если вы включаете интервью :)).
Проблема определения объема: когда срабатывает lambda
, он проверяет область действия для переменной cmd
. Во время каждой итерации for cmd in commands:
переменная cmd
устанавливается в новое значение. В конце итерации переменная cmd
в кадре равна окончательной итерации for cmd in commands:
(т. Е. - {'label': 'retrieve', 'reqId': 2}
).
Решение состоит в том, чтобы указать «новую» переменную в сигнатуре lambda
, которую он затем будет использовать из-за того, как работает область видимости в python (цитирует «new», потому что это может быть переменная с тем же именем ). В частности, вы можете изменить свой код на что-то вроде:
for cmd in commands:
self.rightMouse[treeName].add_command(label= cmd['label'],
command= lambda reqid = cmd['reqId']: self.execCommand(reqid))
Ниже приведен скрипт, демонстрирующий то, о чем я говорю, на примере:
lambdas = []
words = ["Hello","World"]
print("Creating Lambds")
for word in words:
my_lambda = lambda: word
print('>>> Result for "{}" lambda: "{}"'.format(word,my_lambda()))
lambdas.append(my_lambda)
print("Post Loop Lambda Results")
for w,_lambda in zip(words,lambdas):
print('>>> Result for "{}" lambda: "{}"'.format(w,_lambda()))
word = "Foobar"
print('Setting word variable to "{}"'.format(word))
print("New Results for lambdas:")
for w,_lambda in zip(words,lambdas):
print('>>> Result for "{}" lambda: "{}"'.format(w,_lambda()))
print("----------------\nSolution:\n")
lambdas = []
words = ["Hello","World"]
print("Creating Lambds")
for word in words:
my_lambda = lambda myword = word: myword
print('>>> Result for "{}" lambda: "{}"'.format(word,my_lambda()))
lambdas.append(my_lambda)
print("Post Loop Lambda Results")
for w,_lambda in zip(words,lambdas):
print('>>> Result for "{}" lambda: "{}"'.format(w,_lambda()))
word = "Foobar"
print('Setting word variable to "{}"'.format(word))
print("New Results for lambdas:")
for w,_lambda in zip(words,lambdas):
print('>>> Result for "{}" lambda: "{}"'.format(w,_lambda()))
Вот несколько ссылок: [ 1119]