numpy Python中的多重赋值[复制]

wbgh16ku  于 2022-11-10  发布在  Python
关注(0)|答案(2)|浏览(114)

这个问题在这里已经有答案

Python assigning multiple variables to same value? list behavior(12个答案)
21天前关门了。
在Python中初始化多个变量时,似乎每个变量都是不同的(即不是引用):

>>>x = y = z = 6
>>>x=5
>>>y=0
>>>print(x,y,z)
>>>5 0 6

但当我使用数值数组时,每个变量实际上都是一个引用:

import numpy as np
x = y = z = 6*np.ones(1)
x[0] = 5
y[0] = 0
print(x,y,z)
[0.] [0.] [0.]

为什么我会看到这种不同?

oxcyiej7

oxcyiej71#

这归根结底是类型的不同。整数不是通过引用传递的,因此每个变量都有自己的数字副本。但是,如果你看一个不同的对象,比如一个列表:

x = y = z = [0,1,2]
x[0] = 2
print(x, y, x)
[2, 1, 2], [2, 1, 2], [2, 1, 2]

这也是通过引用传递的,因此它们都一起更改。
字符串和整数是我能想到的主要例子,你是值,而其他所有东西(我认为)都是引用。
与此相关的有趣之处在于:就地操作对字符串和整数的行为不同于其他对象。例如:

x = 1
print(id(x))
x += 1
print(id(x))

的行为不同于

y = []
print(id(y))
y += [1]
print(id(y))

您可以看到,在第一个示例中,一个新对象现在被赋给了x变量,而在第二个示例中,y变量是同一个对象。

t3psigkw

t3psigkw2#

您需要复制以下内容:

a = 6*np.ones(1)

x, y, z = (a.copy() for _ in range(3))

# or directly

# x, y, z = (6*np.ones(1) for _ in range(3))

x[0] = 1
(x, y, z)

输出:

(array([1.]), array([6.]), array([6.]))

相关问题