Python范围规则究竟是什么?
如果我有一些代码:
code1
class Foo:
code2
def spam.....
code3
for code4..:
code5
x()
Run Code Online (Sandbox Code Playgroud)
在哪里x找到?一些可能的选择包括以下列表:
在执行期间,当函数spam在其他地方传递时,也存在上下文.也许lambda函数的传递方式有点不同?
某处必须有简单的参考或算法.对于中级Python程序员来说,这是一个令人困惑的世界.
我正在尝试在循环内创建函数并将它们存储在字典中.问题是字典中的所有条目似乎最终都映射到最后创建的函数.代码如下:
functions = []
for i in range(3):
def f():
return i
# alternatively: f = lambda: i
functions.append(f)
Run Code Online (Sandbox Code Playgroud)
这输出:
print([f() for f in functions])
# expected output: [0, 1, 2]
# actual output: [2, 2, 2]
Run Code Online (Sandbox Code Playgroud)
知道为什么吗?
我想从Python中的常量列表中创建一个lambda对象列表; 例如:
listOfNumbers = [1,2,3,4,5]
square = lambda x: x * x
listOfLambdas = [lambda: square(i) for i in listOfNumbers]
Run Code Online (Sandbox Code Playgroud)
这将创建一个lambda对象列表,但是,当我运行它们时:
for f in listOfLambdas:
print f(),
Run Code Online (Sandbox Code Playgroud)
我希望它会打印出来
1 4 9 16 25
Run Code Online (Sandbox Code Playgroud)
相反,它打印:
25 25 25 25 25
Run Code Online (Sandbox Code Playgroud)
似乎lambdas都被赋予了错误的参数.我做错了什么,有没有办法解决它?我认为我在Python 2.4中.
编辑:更多的尝试事情,并提出了这样的想法:
listOfLambdas = []
for num in listOfNumbers:
action = lambda: square(num)
listOfLambdas.append(action)
print action()
Run Code Online (Sandbox Code Playgroud)
将预期的正方形从1打印到25,然后使用之前的print语句:
for f in listOfLambdas:
print f(),
Run Code Online (Sandbox Code Playgroud)
仍然给了我所有25的.现有的lambda对象在这两个打印调用之间是如何变化的?
相关问题:为什么map()和列表理解的结果不同?
def multipliers():
return [lambda x: i * x for i in range(4)]
print([m(1) for m in multipliers()]) # [3, 3, 3, 3]
Run Code Online (Sandbox Code Playgroud)
为什么不是[0, 1, 2, 3]?无法理解。那么,出于某种原因,我们i = 3在所有 lambda 表达式中都有?为什么?