Python中将函数赋值给列表时的实际运行机制是怎样的?
问题解答
你的猜测完全正确,我们可以拆解代码的执行逻辑验证这一点:
Python中的变量本质是指向内存中对象的标签,所有赋值操作传递的都是对象的引用,不会绑定变量本身:
- 执行
def square(x): ...时,内存中会生成一个函数对象,square变量是指向这个函数对象的标签 - 执行
foo = square时,相当于给同一个函数对象新增了一个foo标签,此时square和foo指向完全相同的函数对象 - 执行
x = [square, foo]时,是把这两个变量当时指向的函数对象的引用存入列表的对应位置,此时列表内的引用已经和square、foo这两个变量本身没有关联了 - 后续执行
foo = 5,只是把foo这个标签从原来的函数对象上解绑,重新绑定到整数5对应的对象上,完全不会影响列表中已经存储的引用,所以第二次打印x时第二个元素还是原来的函数地址。
关于列表元素的修改
是的,你只能通过x[索引]这类下标访问语法修改列表对应位置的元素值。因为列表存储的是独立的引用集合,每个位置的引用和你初始化时用到的外部变量没有后续关联,要修改某一位的引用,必须显式通过下标定位到对应位置重新赋值,比如你要让第二个元素变成5,需要执行x[1] = 5。
内容的提问来源于stack exchange,提问作者jureaky
相关产品推荐
相关产品推荐

