停止Python函数覆盖输入

停止Python函数覆盖输入,python,variables,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”。我原以为行zero=dataset[:

我有一个简单的函数,它应该沿着数组的对角线运行,并将所有值都转换为0

def diagonal_zeros(dataset):
    zero = dataset[:]
    length = len(zero)
    for i in range(length):
        zero[i, i] = 0
    return zero
当我在数组上运行此函数时,它会输出新的、正确的“zero”数组,但它也会返回并覆盖原始的“dataset”。我原以为行
zero=dataset[:]
会阻止这一点

但是,我没有得到与此函数相同的行为:

def seperate_conditions(dataset, first, last):
    dataset = dataset[first:last, :]
    return dataset
使第一个数据集保持不变。我一直在阅读相关问题的答案,但我一辈子都搞不懂这一点。我正在研究一个科学分析管道,所以我真的希望能够在每一步都返回到矩阵


感谢

python中的参数是通过赋值传递的(感谢@juanpa.arrivillaga的更正),而不是通过值传递的。这意味着函数通常不接收参数的副本,而是接收指向参数本身的“指针”。如果在函数中更改参数引用的对象,则在外部修改相同的对象

一种可能性是在函数内部使用,以创建数据集的副本

例如,对于您的代码:

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]]

在这个概念上帮了我很大的忙。

我想你正在使用
numpy
numpy
slicing返回一个视图,而不是一个副本。@juanpa.arrivillaga你说得对,为了清晰起见,我编辑了评论。