创建副本时如何避免更改原始全局变量

时间:2019-09-03 18:21:47

标签: python python-3.x

我正在做家庭作业,但我遇到了一个我不太了解的python怪异问题。我根据一些输入数字创建一个算盘,为此,我创建了一个基本算盘或一个“空”算盘,将0表示为全局变量。在我的函数中,将new_abacus值设置为等于empty_abacus全局变量;但是由于某些原因,当我更改new_abacus变量时,empty_abacus变量也会更改。

在我的功能内:

def function(input_num):  
  global empty_abacus
  new_abacus = empty_abacus 

  #I then change the new_abacus variable

  return new_abacus

当我尝试使用此功能后打印出empty_abacus时,它已被更改。我认为这是在python中使用全局变量有些奇怪的事情。更改new_abacus时如何防止empty_abacus更改。换句话说,如何为new_abacus分配empty_abacus的值;而不是参考。

注意:empty_abacus是一个二维列表

编辑:如果标题令人误解,我深表歉意,我不确定如何用文字表达。

2 个答案:

答案 0 :(得分:1)

这里问题的症结是new_abacus = empty_abacus,它没有按照您的想法执行。 empty_abacus通过引用传递,这意味着new_abacusempty_abacus都将指向内存中的相同位置。更改二者之一将影响内存中的相同空间。

相反,empty_abacusnew_abacus中的make a copy

import copy

# ... other code here ...

new_abacus = copy.deepcopy(empty_abacus)

答案 1 :(得分:0)

new_abacus = empty_abacus

此行不会复制变量,而是将其引用为同一变量。

您需要根据数据类型创建另一个变量副本: 像这样的一些使它更加清晰: Copied variable changes the original?

如评论中所述: new_abacus = copy.deepcopy(empty_abacus)

这将创建另一个副本,因此您不会引用内存中的同一对象