Python 使用复制的对象指定给全局变量时,复制对象的引用会发生更改

Python 使用复制的对象指定给全局变量时,复制对象的引用会发生更改,python,numpy,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

我有一个全局变量,它包含图像的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\u copy的值,但作为一种副作用,img\u copy现在被分配给img的引用,因此分配后
id(img\u copy)==id(img)


有谁能告诉我为什么会发生这种情况,以及如何保持img\u copy的原始值,并且仍然将img\u copy的内容分配给img吗?

确实,两个名称的id都相同,但原因是您已将
img\u 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

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

两个名称的id都是相同的,但原因是您已将
img\u 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

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

要将
img\u copy
中的值复制到数组
img

img[...] = img_copy
(省略号是字面意思,不是我留给你填写的。)


“现在,当我按空格键一次时,img接受img_copy的值,但作为一个副作用,img_copy现在被分配给img的引用,因此分配img=img_copy后id(img_copy)=id(img)

谁能告诉我为什么会发生这种情况……”

因为在python中,
=
赋值就是这样工作的!当你说
a=b
时,
a
b
现在只是同一对象的不同名称;没有复制发生


还有一个注意事项:不要在此行中使用
copy
模块:

    img_copy = copy.copy(img)
可以使用numpy数组的方法:


要将
img\u copy
中的值复制到数组
img

img[...] = img_copy
(省略号是字面意思,不是我留给你填写的。)


“现在,当我按空格键一次时,img接受img_copy的值,但作为一个副作用,img_copy现在被分配给img的引用,因此分配img=img_copy后id(img_copy)=id(img)

谁能告诉我为什么会发生这种情况……”

因为在python中,
=
赋值就是这样工作的!当你说
a=b
时,
a
b
现在只是同一对象的不同名称;没有复制发生


还有一个注意事项:不要在此行中使用
copy
模块:

    img_copy = copy.copy(img)
可以使用numpy数组的方法:


我向所有新的python程序员建议:忘记
global
的存在,因为它几乎总是错误的,特别是对于实例、类和模块范围的标识符。我很想将
copy.copy()
添加到该列表中,因为我几乎从未使用过它(就像我不记得上一次使用它一样)。我也读过这篇文章,但我的问题是,我使用的是OpenCV的事件处理,无法将要标记为参数的图像传递给回调函数,所以全局变量是我能想到的唯一选择。如果您有更好的方法来解决这个问题,我很乐意听您这么说。您可能可以向回调注册传递一个模块范围的变量。模块只是在您的
mycode.py
文件的顶层分配的变量;可在模块外部作为
mycode.variable
访问,或在mycode模块内部称为
variable
。因此,您可以调用
opencv.subpackage.register\u callback(一些函数、变量)
,它应该可以工作。我向所有新的python程序员建议:忘记
global
的存在,因为它几乎总是错误的,特别是对于实例、类和模块范围的标识符。我很想将
copy.copy()
添加到该列表中,因为我几乎从未使用过它(就像我不记得上一次使用它一样)。我也读过这篇文章,但我的问题是,我使用的是OpenCV的事件处理,无法将要标记为参数的图像传递给回调函数,所以全局变量是我能想到的唯一选择。如果您有更好的方法来解决这个问题,我很乐意听您这么说。您可能可以向回调注册传递一个模块范围的变量。模块只是在您的
mycode.py
文件的顶层分配的变量;可在模块外部作为
mycode.variable
访问,或在mycode模块内部称为
variable
。因此,您可以调用
opencv.subpackage.register\u回调(一些函数、变量)
,它应该可以工作。