停止Python函数覆盖输入

时间:2017-11-17 16:38:38

标签: python variables

我有一个简单的函数应该在数组的对角线上运行并将所有值都转为0.

def diagonal_zeros(dataset):
    zero = dataset[:]
    length = len(zero)
    for i in range(length):
        zero[i, i] = 0
    return zero

当我在一个数组上运行此函数时,它会输出新的,正确的'零'数组,但它也会返回并覆盖原始数据集。'我以为行zero = dataset[:]会阻止这一点。

但是,我没有使用此函数获得相同的行为:

def seperate_conditions(dataset, first, last):
    dataset = dataset[first:last, :]
    return dataset

使第一个数据集保持不变。我一直在阅读StackOverflow相关问题的答案,但我不能为我的生活弄清楚这一点。我正在研究科学分析管道,所以我真的希望能够在每一步都参考矩阵。

由于

1 个答案:

答案 0 :(得分:1)

python中的参数由赋值传递(感谢@ juanpa.arrivillaga进行更正),而非值。这意味着通常函数不会收到参数的副本,而是一个"指针"论证本身。如果更改函数中参数引用的对象,则表示您正在修改外部的同一对象。 Here's a page with some more information

可能是使用函数内的copy module来创建数据集的副本。

例如,代码:

import copy
myDataset = [[1,2,3],[2,3,4],[3,4,5]]

def diagonal_zeros(dataset):
    zero = copy.deepcopy(dataset)
    length = len(zero)
    for i in range(length):
        zero[i][i] = 0
    return zero

result = diagonal_zeros(myDataset)
print(result)     #[[0, 2, 3], [2, 0, 4], [3, 4, 0]]
print(myDataset)  #[[1, 2, 3], [2, 3, 4], [3, 4, 5]]

This article帮助了我很多这个概念。