Python 使用复制的对象指定给全局变量时,复制对象的引用会发生更改
我有一个全局变量,它包含图像的numpy数组,在我的函数中,我首先使用copy.copy(img)创建该图像的副本,然后在无限循环中,每当按下某个键时,我尝试将复制的图像重新分配给全局变量,这是相关代码的结构: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
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回调(一些函数、变量)
,它应该可以工作。