python正在窃取我的对象

tom*_*tom 2 python garbage-collection

好吧,我只是学习Python而且我遇到了一些奇怪的行为.我想垃圾收集器对此负责,但我不确定.

抱歉,我解读了这个问题

我想重现一些我在使用没有该库的库时得到的奇怪但我失败了.

所以第二次尝试:

我正在使用Autodesk Maya的python API.它只是围绕现有C++ API的python包装.

所以这段代码:

import maya.OpenMaya as om

Q = om.MQuaternion(1,2,3,4).conjugateIt()
P = om.MQuaternion(6,6,6,6)
print(Q[0],Q[1],Q[2],Q[3])
print(type(Q))
print(type(P))
Run Code Online (Sandbox Code Playgroud)

产生这个输出:

(6.0, 6.0, 6.0, 6.0)
<class 'maya.OpenMaya.MQuaternion'>
<class 'maya.OpenMaya.MQuaternion'>
Run Code Online (Sandbox Code Playgroud)

所以两者P,Q都是类型,MQuaternionQ不保留它应该保存的数据.在这里你可以找到文档MQuaternion类.conjugateIt是共轭的,并通过引用返回.

那么现在出了什么问题?


这是一个错误的旧问题:D

在C++中,我习惯做这样的事情.

complex<float> c = complex<float>(1,2).conjInPlace()
Run Code Online (Sandbox Code Playgroud)

conjInPlace()就是结合

但如果我在python中做类似的事情,我就会陷入困境

class testClass:
        def __init__(self,_a,_b):
            self.a = _a
            self.b = _b
        def alterMe(self):
            self.b = 123

A = testClass(1,2)
A.alterMe()
print(A.a,A.b)
B = testClass(0,0)
B = testClass(3,4).alterMe()
print(B)
Run Code Online (Sandbox Code Playgroud)

给我输出:

1 123
None
Run Code Online (Sandbox Code Playgroud)

我想这是因为返回的对象testClass(3,4)没有被某些东西立即引用,所以它被删除了.

那为什么会这样呢?如何注意这种事情?

che*_*ner 6

A确实被这种alterMe方法改变了.但是B设置为该方法的返回值,而None不是另一个testClass对象.