python - python参数实际上是参数的别名吗?

标签 python function parameters arguments

<分区>

请考虑下面的代码。

a = []

def func1(x):
    return x

for i in range(3):
    def func2():
        return func1(i)

    a.append(func2)

for k in range(3):
    print(a[k]())

打印出来

2
2
2

来自 http://gestaltrevision.be/wiki/python/aliases 中的“别名的使用” (最后一节)和 http://gestaltrevision.be/wiki/python/functions_basics 中的“范围”部分,我了解到函数参数实际上是传递的参数的别名。

所以根据那个,在

def func1(x): return x

for i in range(3):
    def func2(): return func1(i)

我的推理是因为 x 将作为 i 的别名存储,即使每次执行循环时 i 都被重新分配,它的别名 x 也无关紧要。

所以我希望前三行输出 0、1、2 而不是 2、2、2。

你能解释一下我做错了什么吗?谢谢

最佳答案

您在这里创建了一个闭包 func2,它使用来自封闭范围的变量 i。 func2 的实例由 DEF 语句在 FOR 循环执行时创建。

然后在退出 FOR 循环后执行 func2。 在 python 中,循环变量在循环退出后不会被销毁。 因此,您的闭包在退出循环时使用封闭范围内 i 的当前值。

所以在这段代码中,func1 没有任何改变,没有它,结果是一样的。

关于python - python参数实际上是参数的别名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36660879/

相关文章:

parameters - 如何通过向 MEF 中的导出器传递参数来导入零件?

python - Cloudwatch 事件没有触发我的 lambda 函数,即使它是一个目标

python - 获取python列表中下一个非零值的索引

function - 在 F# 中,是否可以检查两个值是否具有相同的构造函数?

python - secret 圣诞老人分院帽

c++ - lambda C++ 的类型转换

jdbc - 访问MySQL数据库的数据库URL的Jmeter JDBC连接配置参数化

mysql - 如何在面向对象的 Coldfusion 设置中设置动态数量的表单字段?

python - 在python中将两个变量放入for-in循环中是什么意思

python - 检查字典中键内的键