如何输入数组VALUE作为参数而不是其REFERENCE?

时间:2019-03-18 22:27:47

标签: python arrays oop reference

我在python上有一个小问题。我找到了一种绕过它的方法,但是仍然困扰着我... 以下面的代码为例,我尝试将其重写为最简单的形式:

"WE DEFINE A SIMPLE OBJET" 
class Object():
    def __init__(self,argument):
        self.table = argument

"We define an array that will be used as the argument for the 'Object' instances" 
tab = [0,0]

"We instanciate 2 'Object' using the 'tab' array as an argument" 
Obj1=Object(tab)
Obj2=Object(tab)

"We change the first value of the first Object's table to 1" 
Obj1.table[0] = 1

"RESULTS (we are expecting the first Object's tab to be [1,0] and the second to be [0,0] but we get [1,0] for both)" 
print(Obj1.table) 
print(Obj2.table)

出:

  

>> [1,0]

     

>> [1,0]

似乎不是用' tab '值创建对象 self.table 变量,而是将 self.table 链接到标签变量的引用。结果,当我们尝试在两个对象之一中修改 self.table 变量时,也会在所有其他实例中对其进行修改。正常吗我的代码有问题吗?

有关信息,我将第四行更改为:

self.table = [argument[x] for x in range(len(argument))]

谢谢!! :)

PS:我不知道是否有任何链接,但是这种其他行为也困扰着我。也许根本原因是相同的:

在:

a = [[0,0]]*2
a[0][0] = 1
print(a)

出:

  

>> [[1,0],[1,0]]

这是意外结果,而

在:

a = [[0,0] for x in range(2)]
a[0][0] = 1
print(a)

出:

  

>> [[1,0],[0,0]]

给出了预期的结果..:p

2 个答案:

答案 0 :(得分:0)

来自Python文档:

  

Python中的赋值语句不复制对象,它们创建   目标和对象之间的绑定。对于是   易变或包含易变项目,因此有时需要一份副本   可以更改一个副本而无需更改其他副本。

对于复制对象,有一个特殊的模块可以完成任务。 Python copy module

答案 1 :(得分:0)

进行分配时(例如本例中的内容),不是在创建新对象,而是创建对原始对象的引用。另一种选择是按照https://docs.python.org/2/library/copy.html进行深度复制,但是IMO这确实很麻烦。

如何避免此问题,是通过尝试使程序尽可能不变,这意味着我不想重新分配变量或更改现有变量。而是,您尝试保留对象状态并根据其他对象的内容创建新对象。