我以这种方式创建一个lambda函数数组(在16位表示上移位n位,但问题与函数角色无关):
>>> lshifting=[lambda x:(x<<y) & 65535 for y in range(0,16)]
我期望每个lambda使用函数实例化时的y值。
如果我检查,每个lambda在内存中是一个不同的对象:
>>> print (lshifting)
[<function <lambda> at 0x7f11b632fde8>, <function <lambda> at 0x7f11b632fe60>, <function <lambda> at 0x7f11b632fed8>,....
然而,这种行为并不是我所期望的:
>>> [x(1) for x in lshifting]
[32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768]
>>> [(1<<y) & 65535 for y in range(0,16)]
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768]
我显然希望两个结果都是相同的,而所有lambdas似乎都是通过引用临时y
变量创建的,然后在使用时,取这个变量的最后一个已知值。
我有两个问题: