为什么一个变量被我的函数改变而另一个没有?

2024-10-02 10:20:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用Python时遇到了一些麻烦。我定义了一个简单的函数,它以两个列表(都包含两个元组)作为参数。在函数执行过程中,元组会逐渐添加到addmap,而在函数的最后,名为toberemoved的列表会从removemap中删除

这两个参数都表示函数外部的列表。虽然函数运行后列表addmap发生了变化,但removemap保持不变。这很奇怪,因为如果我在函数中打印出removemap,它会显示我想要的结果。我只是看不到外面。这是怎么回事?谢谢你

def loescheeinzelgaenger(removemap, addmap):
    toberemoved = [] #lists all the list values which should be removed from the removemap and added to the addmap
    for row in range(shape[0]):
        for column in range(shape[1]):
            if (row,column) in removemap:
                # define 4 neighbours
                n1 = (row - 1, column)
                n2 = (row, column - 1)
                n3 = (row + 1, column)
                n4 = (row, column + 1)
                if intersection([n1,n2,n3,n4],removemap) == []:
                    toberemoved.append((row, column))
                    addmap.append((row, column))
                elif intersection([n1,n2,n3],removemap) == []:
                    toberemoved.append((row, column))
                    addmap.append((row, column))
                elif intersection([n2,n3,n4],removemap) == []:
                    toberemoved.append((row, column))
                    addmap.append((row, column))
                elif intersection([n1, n3,n4],removemap) == []:
                    toberemoved.append((row, column))
                    addmap.append((row, column))
                elif intersection([n1,n2,n4],removemap) == []:
                    toberemoved.append((row, column))
                    addmap.append((row, column))
    removemap = [x for x in removemap if x not in toberemoved]
    print(removemap) #it's changed here

#further down:

print(grassMap) #initial
print(waterMap) #initial

loescheeinzelgaenger(waterMap,grassMap)

print(grassMap) #changed
print(waterMap) #unchanged


Tags: 函数in列表columnrowprintappendn2
3条回答

添加return语句以获取所需的值:

def loescheeinzelgaenger(removemap, addmap):
    toberemoved = [] #lists all the list values which should be removed from the removemap and added to the addmap
    for row in range(shape[0]):
        for column in range(shape[1]):
            if (row,column) in removemap:
                # define 4 neighbours
                n1 = (row - 1, column)
                n2 = (row, column - 1)
                n3 = (row + 1, column)
                n4 = (row, column + 1)
                if intersection([n1,n2,n3,n4],removemap) == []:
                    toberemoved.append((row, column))
                    addmap.append((row, column))
                elif intersection([n1,n2,n3],removemap) == []:
                    toberemoved.append((row, column))
                    addmap.append((row, column))
                elif intersection([n2,n3,n4],removemap) == []:
                    toberemoved.append((row, column))
                    addmap.append((row, column))
                elif intersection([n1, n3,n4],removemap) == []:
                    toberemoved.append((row, column))
                    addmap.append((row, column))
                elif intersection([n1,n2,n4],removemap) == []:
                    toberemoved.append((row, column))
                    addmap.append((row, column))
    removemap = [x for x in removemap if x not in toberemoved]
    print(removemap) #it's changed here
    return removemap, addmap

 waterMap,grassMap = loescheeinzelgaenger(waterMap,grassMap)

你基本上是在告诉Python:在这个函数中所做的所有事情中,我希望你给我这两个变量在函数末尾的状态

您的代码显式地改变addmap

                addmap.append((row, column))

这将附加到现有列表。但是,您使用不同的“技术”来处理本地removemap

removemap = [x for x in removemap if x not in toberemoved]

这意味着获取传入的removemap,遍历它的元素,过滤掉你想要的元素,然后从这些元素中创建一个新的列表。最后,将这个新列表赋给局部变量removemap。由于这会将对象引用更改为新列表,因此您不再使用从调用例程传入的引用。。。而这个removemap变量仍然指向原始列表

要更改原始列表,可以小心地使用remove方法:

for rem in toberemoved:
    while rem in removemap:
        removemap.remove(rem)
removemap = [x for x in removemap if x not in toberemoved]

此行创建一个新的本地列表,该列表与传递给函数的列表无关

唯一明显的解决方案是从函数返回:

def loescheeinzelgaenger(removemap, addmap):
    ...    
    return [x for x in removemap if x not in toberemoved]

waterMap = loescheeinzelgaenger(waterMap, grassMap)

相关问题 更多 >

    热门问题