Python通过引用混淆传递对象

时间:2018-12-04 03:39:00

标签: python arrays function object pass-by-reference

嗨,我似乎在理解通过Python引用传递对象方面遇到问题。我了解示例1的输出,但是示例2不应以类似的方式运行并且不更改A矩阵吗?

示例1:

def reassign(list):
  list = [0, 1, 2]

list = [3]
reassign(list)
print(list)

Returns: [3]

示例2:

import numpy as np

A = np.ones((4,4))

def xyz(A):
    for i in range(4):
        A[i,i] = 0    
    return None

x = xyz(A)
print(A)

# Returns

[[0. 1. 1. 1.]
 [1. 0. 1. 1.]
 [1. 1. 0. 1.]
 [1. 1. 1. 0.]]

1 个答案:

答案 0 :(得分:0)

通过引用传递意味着,当您将变量传递给函数时,您没有传递变量本身,而是将指针传递给了变量,即从外部到内部复制。在示例1中,您将list传递给该函数,该函数是指向包含元素[3]的列表的指针。但是,紧接着之后,您将变量保存到列表的指针,并在其中放入新指针,以指向包含元素[0, 1, 2]的新列表。请注意,您没有更改开始的列表-您更改了引用该变量的变量。当您退出该函数时,传递给该函数的变量(仍然是指向第一个列表的指针)没有改变-它仍指向包含元素[3]的列表。

在示例2中,您将A传递到xyz()中。而在示例1中,您按照

的方式做了一些操作
A = something_else

在这里,你在做

A[i] = something_else

这是完全不同的操作-您无需更改保存列表所指向的变量,而是通过更改列表元素之一来更改列表本身。而不是使A指向其他对象,而是通过取消引用来更改A指向的值。