停止Python函数覆盖输入
我有一个简单的函数,它应该沿着数组的对角线运行,并将所有值都转换为0停止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[:
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你说得对,为了清晰起见,我编辑了评论。