numpy array assignment problem
我在Python2.6.5中有一个关于numpy的奇怪问题。我分配了一个numpy数组,然后将一个新变量等效到它。当我对新数组执行任何操作时,原始数组的值也会更改。为什么会这样?请参阅下面的示例。请启发我,因为我对Python和一般编程还比较陌生。
-苏扬
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | >>> import numpy as np >>> a = np.array([[1,2],[3,4]]) >>> b = a >>> b array([[1, 2], [3, 4]]) >>> c = a >>> c array([[1, 2], [3, 4]]) >>> c[:,1] = c[:,1] + 5 >>> c array([[1, 7], [3, 9]]) >>> b array([[1, 7], [3, 9]]) >>> a array([[1, 7], [3, 9]]) |
这实际上根本不是问题,而是数组(和其他对象)在Python中的工作方式。
请这样想:您在代码示例中创建的数组是一个位于内存中某个位置的对象。但是你不能在你的程序中通过告诉python在内存中的哪个位置去寻找它来使用它;你必须给它一个名字。当你写作时
1 | a = np.array([[1,2],[3,4]]) |
您正在创建数组并创建引用该数组的名称
1 2 3 | ..., 'a' : 0x123674283, ... |
当您将一个变量的值赋给另一个变量时,例如
1 | b = a |
python不会复制整个数组,因为如果它是一个大数组,则需要很长时间。相反,它会转到符号表,并将
1 2 3 4 5 | ..., 'a' : 0x123674283, ..., 'b' : 0x123674283, ... |
你看,
如果要实际复制数组,则必须调用一个方法来显式执行该操作。numpy数组有一个
1 | b = a.copy() |
然后,python将首先实际复制数组——也就是说,它留出了一个新的内存区域,比如在地址0x123904381处,然后转到内存地址0x123674283,并将数组的所有值从内存的后一部分复制到前一部分。所以你在记忆中的两个不同的地方有相同的内容。
1 2 3 4 5 | ..., 'a' : 0x123674283, ..., 'b' : 0x123904381, ... |
现在,当您更改
简言之,变量赋值创建对现有对象的新引用。
1 2 | A = object # A points to object in memory B = A # B points to the same object |