使用 lambda 的深层复制索引整数
Deep copy index integer using lambda
func = []
for value in range(5):
func.append(lambda: print_index(value))
def print_index(index_to_print):
print(index_to_print)
for a in func:
a()
当我运行上面的代码时,输出是
4
4
4
4
4
为什么不是?
0
1
2
3
4
我该怎么做才能像上面那样。
我试过导入副本并使用 copy.deepcopy(index)
。我没有工作可能是因为索引是一个整数。
lambda
是它不工作的部分原因。
感谢您的帮助!
不太确定您要实现的目标但是它打印所有 4
的原因是因为 Python 使用变量的动态名称解析,即 [=13 的值=] 在执行函数时(而不是在声明函数时)使用。
如果你真的需要一个函数来打印值那么你需要创建一个闭包,这意味着在另一个函数中创建函数,例如:
def make_closure(v):
return lambda: print_index(v)
func = []
for value in range(5):
func.append(make_closure(value))
现在输出:
In []:
for a in func:
a()
Out[]:
0
1
2
3
4
正如@AChampion 所说,Python 在需要时而不是在执行循环时计算 value
的值。
但是对我来说,进行以下修复似乎更容易。
func = []
for value in range(5):
func.append(lambda v = value: print_index(v))
def print_index(index_to_print):
print(index_to_print)
for a in func:
a()
这是在循环执行期间计算的函数中设置默认参数。上面的代码等同于:
func = []
for value in range(5):
def anonymous_function(v=value):
print_index(v)
func.append(anonymous_function)
def print_index(index_to_print):
print(index_to_print)
for a in func:
a()
func = []
for value in range(5):
func.append(lambda: print_index(value))
def print_index(index_to_print):
print(index_to_print)
for a in func:
a()
当我运行上面的代码时,输出是
4
4
4
4
4
为什么不是?
0
1
2
3
4
我该怎么做才能像上面那样。
我试过导入副本并使用 copy.deepcopy(index)
。我没有工作可能是因为索引是一个整数。
lambda
是它不工作的部分原因。
感谢您的帮助!
不太确定您要实现的目标但是它打印所有 4
的原因是因为 Python 使用变量的动态名称解析,即 [=13 的值=] 在执行函数时(而不是在声明函数时)使用。
如果你真的需要一个函数来打印值那么你需要创建一个闭包,这意味着在另一个函数中创建函数,例如:
def make_closure(v):
return lambda: print_index(v)
func = []
for value in range(5):
func.append(make_closure(value))
现在输出:
In []:
for a in func:
a()
Out[]:
0
1
2
3
4
正如@AChampion 所说,Python 在需要时而不是在执行循环时计算 value
的值。
但是对我来说,进行以下修复似乎更容易。
func = []
for value in range(5):
func.append(lambda v = value: print_index(v))
def print_index(index_to_print):
print(index_to_print)
for a in func:
a()
这是在循环执行期间计算的函数中设置默认参数。上面的代码等同于:
func = []
for value in range(5):
def anonymous_function(v=value):
print_index(v)
func.append(anonymous_function)
def print_index(index_to_print):
print(index_to_print)
for a in func:
a()