Reflection of a modified list outside the function
我目前正在做麻省理工学院在EDX上提供的关于Python的入门课程。而且,教授目前正在教授如何使用函数作为对象。我在其中一个代码中感到困惑,他定义了一个函数并接受了两个参数——一个是列表,另一个是其他函数。
1 2 3 4 5 6 7 8 | def applyToEach(l,f): for i in range(len(l)): l[i]=f(l[i]) l=[1,-2,3.4] applyToEach(l,abs) print(l) |
我的问题是:列表中的更改/修改发生在函数内部。那么,它们是如何在函数之外得到反映的呢?据我所知,当我打印列表时,列表中不应该有任何更改,因为我在函数内部进行了所有更改。我的意思是,不同的环境是为不同的功能而创建的,它只在前面的练习中以这种方式工作,因此,变化不会反映在我们的主要环境中。无论哪里出错,都要纠正我,因为当我运行此代码时,修改后的列表将被打印出来。那么,在给定的逻辑中,我哪里错了呢?
正在将列表作为参数传递给函数。在python中创建列表时,会将内存位置分配给它以供参考。现在,当您传递列表(甚至对列表执行任何操作)时,指定的内存位置将被传递。所以,无论做什么修改,都会反映在列表本身中。但记忆位置不变。所以,不管您是从函数外部还是函数内部访问它,它都指向相同的内存位置。因此,所做的更改在函数外部是可见的。
让名单成为
1 | Fruit = ['Mango', 'Apple', 'Orange'] |
当我们将列表分配给value fruit时,会给它分配一个内存位置(这里是4886)。所以
1 2 3 | def fun(li=[]): li[1] = 'Grape' li.extend(['Apple', 'Banana']) |
所以,在场景后面发生的是,当列表作为参数传递给方法时,实际上,传递列表的引用(或地址)。因此,即使您访问列表并在函数中对其进行修改,它也会按照引用列表的方式修改原始列表。因此,列表引用会得到相应的更新。
在修改之后,它还将显示更新为方法内部的列表。但是,内存位置是相同的,即
即使您将列表分配给一个新的列表
为了避免这种情况,你必须做的是:
1 | temp = list(Fruit) |
这将创建一个具有新内存位置的新列表,因此,
以下链接将使您更好地了解列表在python中的工作方式:http://www.python-course.eu/deep_copy.php
因为它们是相同的物体。您可以通过
1 2 3 4 5 6 7 8 9 10 11 12 13 | #!/usr/bin/env python #-*- coding:utf-8 -*- def applyToEach(l,f): print 'inside id is: ', id(l) for i in range(len(l)): l[i]=f(l[i]) l=[1,-2,3.4] print 'outside id is: ', id(l) applyToEach(l,abs) print(l) |
在python中,向函数传递值等于