Python何时创建新对象

时间:2017-01-17 15:37:09

标签: python

Python使用名称来引用对象。当我们说a = b时,ab现在引用相同的对象,如果我们更改a,我们会在b中看到相同的更改。例如:

a = [1, 2, 3]
b = a

a.append(4)

print(b)

将打印[1, 2, 3, 4]

但是,某些操作会创建新对象。例如:

a = 1
b = a

a = a + 1

print(b)

将打印1。显然,行a = a + 1以某种方式创建了一个值为a + 1的新对象,并将名称a绑定到它。这是如何运作的?在这种情况下,创建新对象的机制是什么?

这个问题不是this one的重复,因为我特别询问在这种情况下如何创建对象,而另一个问题则更广泛地说明名称共享对象的时间。

1 个答案:

答案 0 :(得分:0)

我在Luciano Ramalho的书 Fluent Python 中找到了我所寻找的关于对象创建机制的信息。

Ramalho解释说,虽然int[][] mymethod(int[][]oldArray, int noOfRows){ int[][] newArr; if(noOfRows > 0){ //here copy from oldArray to new; //sorry this is where I can't remember, you will have //to do something to get column size maybe oldArray[0].length() // but that may not work if each row has different length. newArr = new int[noOfRows][]; for(int i=0; i < noOfRows; i++){ for(int j = 0; j < noOfRows; j++){ newArr[i][j] = oldArray[i][j]; } } } return newArr; } 通常被认为是“构造函数”,但事实上,通过调用__init__方法创建了对象。它是一个类方法,它返回一个类的实例,它作为第一个参数传递给__new__(通常是“__init__”)。因此,self是初始化器,而不是构造函数。

这可以通过以下示例来说明:

__init__

class C(object): def __new__(cls): new_inst = object.__new__(cls) print new_inst.__dict__ new_inst.var_1 = 1 return new_inst def __init__(self): print self.__dict__ self.var_2 = 2 a = C() # Prints: # {} # {'var_1': 1} print a.__dict__ # returns {'var_2': 2, 'var_1': 1} b = C.__new__(C) # Prints: # {} print b.__dict__ # returns {'var_1': 1} b.__init__() # Prints: # {'var_2': 2, 'var_1': 1} print b.__dict__ # returns {'var_2': 2, 'var_1': 1} 行调用a = C()后跟__new__,我们可以从__init__的打印输出中看到。这可以分解为单独的调用,如对象__dict__所示。

This question也很重要。