关于python:在函数外部反映修改后的列表

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)。所以id(Fruit) = 4886。现在,假设将列表"fruit"传递给一个函数,在该函数中对其进行如下修改:

1
2
3
def fun(li=[]):
    li[1] = 'Grape'
    li.extend(['Apple', 'Banana'])

所以,在场景后面发生的是,当列表作为参数传递给方法时,实际上,传递列表的引用(或地址)。因此,即使您访问列表并在函数中对其进行修改,它也会按照引用列表的方式修改原始列表。因此,列表引用会得到相应的更新。

在修改之后,它还将显示更新为方法内部的列表。但是,内存位置是相同的,即id(Fruit) = 4886

即使您将列表分配给一个新的列表i.e. temp = Fruit,场景也是如此。temp表示与Fruit相同的位置,两个列表都指向相同的位置。

为了避免这种情况,你必须做的是:

1
temp = list(Fruit)

这将创建一个具有新内存位置的新列表,因此,id(Fruit)id(temp)不同。

以下链接将使您更好地了解列表在python中的工作方式:http://www.python-course.eu/deep_copy.php


因为它们是相同的物体。您可以通过id()is进行验证。

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中,向函数传递值等于'para = value'。但是,='只添加对值的引用,而不是副本。