使用复制的对象分配给全局变量时,复制对象的引用会更改

时间:2016-06-25 19:44:41

标签: python numpy

我有一个包含图像的numpy数组的全局变量,在我的函数中我首先使用copy.copy(img)创建该图像的副本然后在无限循环中我尝试将复制的图像重新分配给按下某个键时,全局变量,这是相关代码的结构:

img = np array 
def label_image():
    global img
    img_copy = copy.copy(img)
    while(1):
        imshow(img)
        if spacebar is pressed:
            img = img_copy

现在当我按空格一次时,img会获取img_copy的值,但是作为副作用,img_copy现在被分配了对img的引用,因此在赋值id(img_copy) == id(img)之后img = img_copy

有人能告诉我为什么会这样,以及如何保留img_copy的原始值并仍然将img_copy的内容分配给img?

2 个答案:

答案 0 :(得分:2)

img_copy中的值复制到数组img中:

img[...] = img_copy

(省略号是字面的,不是我留给你填写的东西。)

“现在当我按空格一次时,img会获取img_copy的值,但作为副作用,img_copy现在被分配了对img的引用,因此在赋值后id(img_copy)== id(img) img = img_copy。

任何人都可以告诉我为什么会发生这种情况......“

因为这就是=的赋值在python中的作用!当您说a = b时,ab现在只是同一对象的不同名称;没有复制。

还有一点需要注意:不要在此行中使用copy模块:

    img_copy = copy.copy(img)

你可以使用numpy数组的copy()方法:

    img_copy = img.copy()

答案 1 :(得分:1)

对于这两个名称,您最终都会使用相同的ID,但原因是您已将img_copy分配给图像,而不是相反。完成此分配后,您有两个相同(新副本!)对象的名称。这是一种看待这个的方法。

img = np.arange(12).reshape((3,4))
def label_image():
    global img
    print id(img)               #see original id
    img_copy = copy.copy(img)   #make a new copy
    if True:
        img = img_copy          #assigns new copy to img
    print(id(img),id(img_copy)) #verify that both reference new copy

在这种情况下,目前还不清楚你还希望发生什么。