【问题标题】:Unwanted List pass by Reference in Function不需要的列表通过函数中的引用传递
【发布时间】:2023-03-05 18:01:01
【问题描述】:

我有这个代码:

import scipy
import scipy.linalg

def LU(A):
    n = scipy.shape(A)[0]
    U = A
    L = scipy.identity(n)

    for j in range(1,n):
        for i in range(j+1,n+1):
            L[i-1,j-1] = U[i-1,j-1]/U[j-1,j-1]
            for k in range(j,n+1):
                U[i-1,k-1] = U[i-1,k-1] - L[i-1,j-1] * U[j-1,k-1]
    return L,U


a = scipy.matrix([[1.0,1.0],[2.0,1.0]])
L,U = LU(a)
print L
print U
print a
print scipy.dot(L,U)

我将如何修复 LU() 中不需要的通过引用传递,其中 U 指向 A 所在的位置,对 U 的更改也会更改 A。

【问题讨论】:

  • Python 总是通过引用传递。
  • 引用传递和值传递的区别在于,值传递是复制整个对象。所以,复制对象。
  • 您可以在通话中进行复制:L, U = LU(copy.deepcopy(a))
  • @DanielRoseman 我不同意,我认为 python never 通过引用传递。但我承认,我对这些事情的理解可能是不正确的。据我了解,传递引用与传递引用不同,后者通常的特点是对调用者看到的变量进行赋值。 IE。 def special(&x): x = 4 然后y = 3; special(y); print(y) 将打印4

标签: python computer-science


【解决方案1】:

您可以通过立即复制来防止修改A

import copy

def LU(A):
    n = scipy.shape(A)[0]
    U = copy.deepcopy(A)
    L = scipy.identity(n)
    # ...

【讨论】:

    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 2011-09-12
    • 1970-01-01
    • 2021-05-16
    相关资源
    最近更新 更多