Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么洗牌数组';A';同时洗牌数组';B';,但是更新int';a';不';t更新int';b';?_Python_Numpy - Fatal编程技术网

Python 为什么洗牌数组';A';同时洗牌数组';B';,但是更新int';a';不';t更新int';b';?

Python 为什么洗牌数组';A';同时洗牌数组';B';,但是更新int';a';不';t更新int';b';?,python,numpy,Python,Numpy,我正在尝试创建一个名为tst的数组的无序副本。我已经定义了一个名为batch的tst副本,然后将batch洗牌,以便tst保持完整和未被洗牌。然而,在这样做的过程中,我发现洗牌batch也(出于某种原因)在这个过程中洗牌tst P>为了完全理解我的困境,考虑下面的代码片段: # First code snippet tst = np.array([0,1,2,3,4,5,6,7,8,9]) batch = tst print(tst) print(batch) seed = 42 np.ran

我正在尝试创建一个名为
tst
的数组的无序副本。我已经定义了一个名为
batch
tst
副本,然后将
batch
洗牌,以便
tst
保持完整和未被洗牌。然而,在这样做的过程中,我发现洗牌
batch
也(出于某种原因)在这个过程中洗牌
tst

<> P>为了完全理解我的困境,考虑下面的代码片段:

# First code snippet
tst = np.array([0,1,2,3,4,5,6,7,8,9])
batch = tst
print(tst)
print(batch)
seed = 42
np.random.seed(seed)
np.random.shuffle(batch)
print(tst)
print(batch)
运行代码时,与此代码段对应的输出如下所示:

[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
[8 1 5 0 7 2 9 4 3 6]
[8 1 5 0 7 2 9 4 3 6]
[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
[8 1 5 0 7 2 9 4 3 6]
…而我认为它应该是这样的:

[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
[8 1 5 0 7 2 9 4 3 6]
[8 1 5 0 7 2 9 4 3 6]
[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
[8 1 5 0 7 2 9 4 3 6]
粗略地说,我的第一个想法是
tst
batch
正在“查看”内存中的同一位置(我没有编程经验,因此如果我的术语错误,我很抱歉),因此更新该位置的特定值可能会更新“查看”同一位置的任何其他变量。但是,如果是这种情况,那么我假设运行以下代码:

# Second code snippet
a = 5
b = a
print(a)
print(b)
a = 3
print(a)
print(b)
…将输出:

5
5
3
3
然而,情况并非如此……相反,它输出:

5
5
3
5
说实话,第二个代码段的输出行为是我最初认为第一个代码段会发生的,因为这对我来说更有意义。对一个变量执行操作不应影响任何其他“相等”变量,除非由某些补充代码或其他东西明确指定


唉,我希望了解为什么第一个代码段的输出行为与第二个代码段的输出行为不同,以及需要做哪些更改,以便我可以在不同时洗牌
tst
的情况下洗牌
batch
。我一直在网上寻找答案,但我觉得我发现的一切要么太先进,不适合我目前的技能,要么根本不适合这个问题。任何帮助都将不胜感激。提前谢谢

如果确实要创建数组副本,则必须使用
ndarray.copy
或其他类似方法
a=b
只是创建了另一个指向同一数组的变量。在python和许多其他语言中,变量只是对“真实数据块”的引用。有时,
a=b
是为“不可变数据”(如标量或元组)创建备份的一种保存方式,但对于可变数据类型,可以“就地”更改(即变异),这通常会失败。特别注意数组、列表、对象、字典和任何其他“可变”数据类型


如果确实要创建数组副本,则必须使用
ndarray.copy
或其他类似方法
a=b
只是创建了另一个指向同一数组的变量。在python和许多其他语言中,变量只是对“真实数据块”的引用。有时,
a=b
是为“不可变数据”(如标量或元组)创建备份的一种保存方式,但对于可变数据类型,可以“就地”更改(即变异),这通常会失败。特别注意数组、列表、对象、字典和任何其他“可变”数据类型


我想你可以试试
batch=tst.copy()
@CamiloMartínez是的,这很有效!非常感谢@谢谢你的链接!Serge和Camilo都给了我很好的快速回答,但看起来你的链接深入了为什么会发生这种情况的细节(在引擎盖下)。我一定会花一些时间来理解你链接的帖子,再次感谢@尼克:是的,那确实回答了!!非常感谢!我想你可以试试
batch=tst.copy()
@CamiloMartínez是的,成功了!非常感谢@谢谢你的链接!Serge和Camilo都给了我很好的快速回答,但看起来你的链接深入了为什么会发生这种情况的细节(在引擎盖下)。我一定会花一些时间来理解你链接的帖子,再次感谢@尼克:是的,那确实回答了!!非常感谢!这个问题解决了,非常感谢!!一旦你的答案被我接受,我会把它标记为“接受”。这就解决了问题,非常感谢!!一旦你的回答让我接受,我会把它标记为“接受”。