相关疑难解决方法(0)

词法闭包如何工作?

当我在调查Javascript代码中的词法闭包问题时,我在Python中遇到了这个问题:

flist = []

for i in xrange(3):
    def func(x): return x * i
    flist.append(func)

for f in flist:
    print f(2)
Run Code Online (Sandbox Code Playgroud)

请注意,此示例谨慎避免lambda.它打印"4 4 4",这是令人惊讶的.我期待"0 2 4".

这个等效的Perl代码是正确的:

my @flist = ();

foreach my $i (0 .. 2)
{
    push(@flist, sub {$i * $_[0]});
}

foreach my $f (@flist)
{
    print $f->(2), "\n";
}
Run Code Online (Sandbox Code Playgroud)

打印"0 2 4".

你能解释一下这个区别吗?


更新:

这个问题是不是i是全球性的.这显示相同的行为:

flist = []

def outer():
    for i in xrange(3):
        def inner(x): return x * i …
Run Code Online (Sandbox Code Playgroud)

python closures late-binding lazy-evaluation

144
推荐指数
5
解决办法
3万
查看次数

如何将参数传递给Tkinter中的Button命令?

假设我Button在Python中使用Tkinter进行了以下操作:

import Tkinter as Tk
win = Tk.Toplevel()
frame = Tk.Frame(master=win).grid(row=1, column=1)
button = Tk.Button(master=frame, text='press', command=action)
Run Code Online (Sandbox Code Playgroud)

action当我按下按钮时调用该方法,但是如果我想将一些参数传递给方法action怎么办?

我尝试过以下代码:

button = Tk.Button(master=frame, text='press', command=action(someNumber))
Run Code Online (Sandbox Code Playgroud)

这只是立即调用方法,按下按钮什么都不做.

python arguments tkinter button python-3.x

143
推荐指数
7
解决办法
22万
查看次数

在循环中创建函数

我正在尝试在循环内创建函数并将它们存储在字典中.问题是字典中的所有条目似乎最终都映射到最后创建的函数.代码如下:

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 function

79
推荐指数
2
解决办法
3万
查看次数

76
推荐指数
4
解决办法
9万
查看次数

Python参数绑定器

如何将参数绑定到Python方法以存储一个用于以后调用的nullary仿函数?与C++类似boost::bind.

例如:

def add(x, y):
    return x + y

add_5 = magic_function(add, 5)
assert add_5(3) == 8
Run Code Online (Sandbox Code Playgroud)

python partial-application

60
推荐指数
5
解决办法
2万
查看次数

Python Lambda循环

考虑以下代码段:

# directorys == {'login': <object at ...>, 'home': <object at ...>}
for d in directorys:
    self.command["cd " + d] = (lambda : self.root.change_directory(d))
Run Code Online (Sandbox Code Playgroud)

我希望创建一个包含两个函数的字典如下:

# Expected :
self.command == {
    "cd login": lambda: self.root.change_directory("login"),
    "cd home": lambda: self.root.change_directory("home")
}
Run Code Online (Sandbox Code Playgroud)

但看起来生成的两个lambda函数完全相同:

# Result :
self.command == {
    "cd login": lambda: self.root.change_directory("login"),
    "cd home": lambda: self.root.change_directory("login")   # <- Why login ?
}
Run Code Online (Sandbox Code Playgroud)

我真的不明白为什么.你有什么建议吗 ?

python loops anonymous-function

57
推荐指数
3
解决办法
2万
查看次数

列表理解中的Lambdas在调用时返回lambda

我试图在列表中迭代lambda func,因为test.py我想得到lambda的调用结果,而不是函数对象本身.但是,以下输出真的让我很困惑.

------test.py---------
#!/bin/env python
#coding: utf-8

a = [lambda: i for i in range(5)]
for i in a:
    print i()

--------output---------
<function <lambda> at 0x7f489e542e60>
<function <lambda> at 0x7f489e542ed8>
<function <lambda> at 0x7f489e542f50>
<function <lambda> at 0x7f489e54a050>
<function <lambda> at 0x7f489e54a0c8>
Run Code Online (Sandbox Code Playgroud)

我在打印调用结果时修改了变量名t,如下所示,一切顺利.我想知道这是怎么回事.?

--------test.py(update)--------
a = [lambda: i for i in range(5)]
for t in a:
    print t()

-----------output-------------
4
4
4
4
4
Run Code Online (Sandbox Code Playgroud)

python lambda

53
推荐指数
2
解决办法
3624
查看次数

`x = 42 是怎么回事;x = lambda: x` 解析了吗?

我很惊讶这个断言失败了:

x = 42
x = lambda: x
assert x() == 42
Run Code Online (Sandbox Code Playgroud)

似乎x结束了递归指本身,这样x()x()()等都是功能。

用于解析它的规则是什么,它记录在哪里?

顺便说一句(不出乎意料地给出了上面的内容), 的原始值x在 lambda 定义之后没有引用:

class X:
  def __del__(self): print('deleting')

x = X()
x = lambda: x  # 'deleting' is printed here
Run Code Online (Sandbox Code Playgroud)

python language-lawyer

47
推荐指数
3
解决办法
2772
查看次数

如何创建Python lambdas列表(在列表解析/ for循环中)?

我想从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()和列表理解的结果不同?

python lambda closures scope list-comprehension

35
推荐指数
4
解决办法
1万
查看次数

obj .__ closure__中究竟包含了什么?

Beazley第100页提到:

>>>python.__closure__
(<cell at 0x67f50: str object at 0x69230>,)
>>>python.__closure__[0].cell_contents
Run Code Online (Sandbox Code Playgroud)

我的理解是这__closure__是一个列表但是这些单元格和str对象是什么?这看起来像一个单元组?

python closures python-internals

34
推荐指数
2
解决办法
6748
查看次数