为什么不同的变量名称会得到不同的结果(python2.7)?

量子能量

在此代码中:

results = []
for i in [1, 2, 3, 4]:
    def inner(y):
        return i
    results.append(inner)

for i in results:
    print i(None)  

输出为“函数内部为0x107dea668”

如果我改变到其他盘符,例如:

results = []
for i in [1, 2, 3, 4]:
    def inner(y):
        return i
    results.append(inner)

for j in results:
    print j(None)

输出为“ 4”


回答

results = []
for i in [1, 2, 3, 4]:
    def inner(y):
        print "in inner:%s " % id(i)
        return i
    results.append(inner)

# i -> 4
for i in results:
    # i -> func inner
    print "i: %s" % i
    print "in loop: %s " % id(i)

    # func inner <===>  A
    # i == A  ->  return i -> return A, so when call funtion inner, will return itself
    # print "call: %s" % i(None)

    print "call: %s" % i(None)(None)(None)
    print "------------------------------"

i:函数内部在0x101344d70
处在循环中:
内部4315172208在内部:4315172208
在内部:4315172208
在内部:4315172208
调用:函数内部在0x101344d70

i:函数内部在0x101344de8
处在循环中:
内部4315172328
在内部:4315172328
内部在:4315172328
内部在:4315172328调用:函数内部在0x101344de8

i:函数内部在0x101344e60
处在循环中:
内部4315172448在内部:4315172448
在内部:4315172448
在内部:4315172448
调用:函数内部在0x101344e60

i:内部函数在0x101344ed8
处循环:内部4315172568
内部:4315172568
内部:4315172568
内部:4315172568
调用:内部函数在0x101344ed8

和路易斯

函数中i返回的变量inner保留其最后分配的上下文中的值。

如果您使用inner函数内部的断点调试代码,则在调用函数之前选择前一帧/上下文(图中左下方),图片将变得更清晰。

当您使用时i,它将在第二个内部分配for,因此它将具有作为其值的功能(在图1中以黄色突出显示)。

图1

现在,如果您使用j,变量i将保留其前一个上下文中的最后一个值:for在列表上方(图2)。

图2

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么将零除为整数基元会得到不同的结果?

哪里vs.拥有-为什么设置日期条件时会得到不同的结果?(MySQL的)

为什么Java和Go的gzip会得到不同的结果?

为什么在添加char时会得到不同的结果?

为什么“向量化”这个简单的R循环会得到不同的结果?

为什么抛出OperationCanceledException会得到不同的结果?

为什么在D3js中使用相同的代码会得到不同的结果?

为什么在检查文件的sha256sum时会得到2个不同的结果?

在Terminal和Java中运行curl命令时,为什么会得到不同的结果?

为什么萨摩亚的pytz和dateutil会得到不同的结果?

为什么对numpy和python list进行相同的操作会得到不同的结果?

为什么用foreach和LINQ .Where()过滤时会得到不同的结果?

Kubernetes Ingress:为什么对于相同的配置但在不同的主机上会得到不同的结果?

为什么在找到内存使用高峰时会得到不同的结果?

为什么在不同的python版本上运行相同的代码会得到不同的输出?

将PS脚本存储在变量中时,为什么会得到不同的结果?

为什么在python中内置和定义的FFT会得到不同的结果?

为什么运行批处理文件会得到不同的结果?

有人知道为什么在IE10中使用IE7模式到IE11中的IE7模式时会得到不同的结果吗?

为什么在使用for和while循环时会得到不同的结果?

为什么Windows 7的名称为7?

为什么用kill -0(<jobspec> | pid)会得到不同的结果

为什么在CentOS 6和CentOS 7之间的/ proc / cpuinfo中得到不同的cpu标志?

当我运行相同的代码但名称不同时,为什么会得到不同的输出?

为什么我偶尔会得到不同的结果?【C语言】

为什么在 GridSearchCV 中使用 StandardScaler 会得到不同的结果?

为什么将结果存储到变量时会得到不同的结果?

为什么在从节点 js 和从 MySQL 运行相同的查询(包括临时变量)时会得到不同的结果?

为什么从不同的文件位置调用时会得到不同的结果?