Python使用名称来引用对象。当我们说a = b
时,a
和b
现在引用相同的对象,如果我们更改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的重复,因为我特别询问在这种情况下如何创建对象,而另一个问题则更广泛地说明名称共享对象的时间。
答案 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也很重要。