python正在从我这里窃取对象

python正在从我这里窃取对象,python,garbage-collection,Python,Garbage Collection,我只是在学习Python,我遇到了一些奇怪的行为。我猜是垃圾收集器造成的,但我不确定 对不起,伙计们,我把问题搞糟了 我想重现我在使用某个图书馆而没有那个图书馆时所得到的一些古怪,但我惨败了 因此,第二次尝试: 我正在使用Autodesk Maya的python API。这只是Python环绕现有C++ API的一个例子。 所以这个代码: import maya.OpenMaya as om Q = om.MQuaternion(1,2,3,4).conjugateIt() P = om.MQ

我只是在学习Python,我遇到了一些奇怪的行为。我猜是垃圾收集器造成的,但我不确定

对不起,伙计们,我把问题搞糟了

我想重现我在使用某个图书馆而没有那个图书馆时所得到的一些古怪,但我惨败了

因此,第二次尝试:

我正在使用Autodesk Maya的python API。这只是Python环绕现有C++ API的一个例子。 所以这个代码:

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))
生成此输出:

(6.0, 6.0, 6.0, 6.0)
<class 'maya.OpenMaya.MQuaternion'>
<class 'maya.OpenMaya.MQuaternion'>
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)
给我输出:

1 123
None
我猜这是因为
testClass(3,4)
返回的对象没有立即被某个对象引用,所以它会被删除


那么为什么会发生这种情况呢?如何注意这类事情?

A
确实被
alterMe
方法改变了。但是,<代码> b <代码>被设置为该方法的返回值,即“代码>没有代码< >代码>,而不是另一个<代码>测试类< /COD>对象。<> >代码> AltMe/<代码>不会返回任何东西——这就是为什么你看不到任何东西。

在C++实例中,<代码> CONJONSPOTE < /C>必须返回复数值,是吗?在您的Python示例中,
alterMe
不会生成
None
,因此
B
被分配值
None
,就像您的
convinplace
返回了一些值X一样,那么
c
将被分配为X。

alterMe
的末尾添加这个值:

return self

这里的问题是
alterMe
没有显式返回值。如果函数末尾没有指定返回值,Python默认返回
None
。这与垃圾收集无关。

您需要使用
alertMe
方法返回调用它的对象:

def alterMe(self):
        self.b = 123
        return self

也就是说,
testClass(3,4)
返回一个对象,但调用alertMe时该对象不返回任何对象。通过上面的修复,它将再次返回对象。

共轭器返回C++中的引用,因此它不会正确返回Python对象。试试这个:

Q = om.MQuaternion(1.0,2.0,3.0,4.0)
print Q.x, Q.y, Q.z, Q.w
Q.conjugateIt()
print Q.x, Q.y, Q.z, Q.w
print "----"
P = om.MQuaternion(6,6,6,6)
print P.x, P.y, P.z, P.w

# 1.0 2.0 3.0 4.0
# -1.0 -2.0 -3.0 4.0
# ----
# 6.0 6.0 6.0 6.0

更新了第一行以反映tom的观察结果

,因为您没有从
alertme
函数返回任何内容。如果希望示例代码正常工作,您应该能够在
alterMe()
函数的底部添加
return self
。您得到的答案是正确的。当然,你可以在
alterMe
的末尾
返回self
,我也做过类似的代码,但修改并返回自己似乎通常被认为是“非Pythonic的”。天哪,如果垃圾收集器是如此激进的话,python将是一种更糟糕的编码语言。哈哈哈:D我把一切都搞糟了:D为这么愚蠢的问题抱歉小伙子们:D@Daenyth我在想。。。你在期待什么
self
self.b
?@ÓscarLópez从
complex
的对象中给定一个
complex
的返回类型,那么我猜它做了一个
返回*this
在Python.FWIW中是
return self
,我不知道为什么swig包装器会给出一个bum指针作为ConjugateIt方法的返回。为什么
ConjugateIt
void
it文档说它是
MQuaternion&
?我的错-它实际上返回了一个引用。。。虽然在python中,您不需要它。共轭体在适当的位置修改Q,并且你们已经有了Q,所以你们可以像上面一样处理它。OpenMaya python文档意味着引用在python中都被视为指针——看起来函数返回的是一个无意义的“指针”(如果不调用P行,就会看到Q中的值是垃圾),你可以用.conjugate而不是.conjugateIt来得到一个新的四元数。好吧,但我还是不明白为什么它返回非ENCE指针?!如果我只做
Q=om.MQuaternion(1,2,3,4).conjugateIt()
print(Q[0],Q[1],Q[2],Q[3])
我得到了几乎正确的答案
(0.0,-2.0,-3.0,4.0)
,因此它指向内存的正确部分。但是内存不是为
Q
保留的,通过声明
P
它会被覆盖。是的,我最终使用了
.conjugate
,但我认为这是浪费,我可以用
conjugateIt做得更好
Q = om.MQuaternion(1.0,2.0,3.0,4.0)
print Q.x, Q.y, Q.z, Q.w
Q.conjugateIt()
print Q.x, Q.y, Q.z, Q.w
print "----"
P = om.MQuaternion(6,6,6,6)
print P.x, P.y, P.z, P.w

# 1.0 2.0 3.0 4.0
# -1.0 -2.0 -3.0 4.0
# ----
# 6.0 6.0 6.0 6.0