2017-03-08 66 views
1

奇怪的事情发生了今天,当我做这样的事情:蟒蛇通过引用传递

a = np.array([1, 2, 3]) 

b = a 

b[0] = 0 

print a, b 

然后是价值似乎被引用传递!答案就变成了:

result: [0 2 3] [0 2 3] 

但通常我想在Python变量是按值传递,就像这样:

a = np.array([1, 2, 3]) 

b = a 

b = np.array([0, 2, 3]) 

print a, b 

然后答案就:

result: [1 2 3] [0 2 3] 

但为何那发生?我如何确定变量是通过引用还是值传递?有人说这是因为可变对象,但我还是不太明白。那么你能为我解释一下吗?非常感谢!

+0

对你而言有什么奇怪的? – Vallentin

+0

可能重复[如何通过引用传递变量?](http://stackoverflow.com/questions/986006/how-do-i-pass-a-variable-by-reference) – TemporalWolf

+0

作业**从不* *在Python中创建一个副本。这总是如何工作。你的第二个例子是*和你的第一个完全一样*。 –

回答

3

,因为它不会有什么直接做NumPy的,让我们把它改写为:

a = [1, 2, 3] 

b = a 

b = [0, 2, 3] 

print a, b 

关键的一点是,名称和值是不同的东西。因此,在第一行:

a = [1, 2, 3] 

您创建一个列表并将其分配给a

现在您分配ab下一行。仍然只有1个名单,这两个名字都只是指它。

接下来创建一个新的列表,并将其分配给b。现在b是指新列表而不是列表。现在轮到现在只有1个名字(a)引用另一个名单,而不是2个名字。

因此,如果我们采取的第一个例子,你这样做:

b[0] = 0 

有两个ab引用相同的列表,从而改变可以从两个名字被观察到,因为这两个名称是指同一个列表。

1

Python中的变量赋值始终赋值给引用。换句话说,在Python中,变量是名称,分配变量是为某个东西声明名称。

a = np.array([1, 2, 3]) 

b = a 

b[0] = 0 

print a, b 

这意味着让a是对于第一个数组的名字,然后让ba一个名字,但a意味着第一阵列,所以我们真的只是说让b也成为了一个名第一阵列。然后b[0] = 0意味着更改数组的第一个元素。然后,当您打印ab时,您正在两次打印相同的东西(数组),因为ab是同一名称。

a = np.array([1, 2, 3]) 

b = a 

b = np.array([0, 2, 3]) 

print a, b 

前两行与上次相同。 a是数组的名称,因此是b。然后b = np.array([0, 2, 3])意味着b现在是这个新阵列的名称。因此,当您打印ab时,您正在打印a(仍然是第一个数组的名称)和b(它是第二个数组的名称)。