数组

时间:2016-01-05 11:34:52

标签: python python-2.7 lambda

我以这种方式创建一个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变量创建的,然后在使用时,取这个变量的最后一个已知值。

我有两个问题:

  • 这是预期的行为吗?
  • 什么是动态实现函数的pythonic方法? (典型的例子是Currying

0 个答案:

没有答案