为什么在更改一个变量时两个变量都会改变?蟒

时间:2018-01-27 18:23:33

标签: python numpy

我有一个下面给出的代码。当我运行代码时,所有x1,x2和x3具有相同的值。按逻辑x1应该有随机数,x2也是随机数,x3应该有0和1。

import numpy as np
def reluDerivative(x):
    yy=x;
    yy[yy<=0] = 0
    yy[yy>0] = 1
    return yy

x1=np.random.uniform(-1, 1,10)
x2=x1
x3=reluDerivative(x1)

2 个答案:

答案 0 :(得分:1)

您应该将python变量视为标签,因此当您执行x2=x1时,您只是为内存中的相同数据创建新标签,这在可变和不可变的行为上有所不同对象,例如:

x1 = []
x2 = x1
x2.append(10)
print(x2)
print(x1)

将导致打印:

[10]
[10]

因为x2x1都标记了相同的列表。对于不可变对象,这是可变对象的行为:

x1 = 10
x2 = x1
x2 += 5
print(x2)
print(x1)

将打印:

15
10

因为在这种情况下,由于x2操作,15被重新分配以标记新创建的+

解决方案就是复制原始对象(对于你的numpy对象)的数据:

x2 = np.copy(x1)

答案 1 :(得分:0)

您只需给同一个列表x1另一个名称:x2该bot指向相同的数据。修改一个正在修改另一个指向的数据。

你需要(浅)复制:

import numpy as np
def reluDerivative(yy):
    return [0 if x <=0 else 1 for x in yy ]

x1 = np.random.uniform(-1, 1,10)
x2 = x1.copy()    # copy of x1, no longer same data
x1[0] = 2         # proves decoupling of x1 and x2
x3 = reluDerivative(x2)

print(x1, x2, x3)

输出:

    [2.           0.84077008 -0.30286357 -0.26964574  0.3979045  -0.8478326
 -0.4056378   0.16776436  0.55790904  0.3550891 ]
    [-0.00736343  0.84077008 -0.30286357 -0.26964574  0.3979045  -0.8478326
 -0.4056378   0.16776436  0.55790904  0.3550891 ]
    [0, 1, 0, 0, 1, 0, 0, 1, 1, 1]