如何在Python中获取对象的引用列表?

时间:2010-12-03 02:29:27

标签: python variables reference

所有

a = 1
b = a
c = b

现在我想获得一个标记为1的对象列表,即[a, b, c]。我怎么能这样做?

顺便说一句,如何正式调用变量“a”?我知道到目前为止它是对象的“对象标签”,但我不知道它的用语是什么。

谢谢!

为什么我需要这个:

a = b = c = 1 
print a, b, c 
1 1 1
a = 2
print a, b, c 
2 1 1
如果我重新赋值a = 2,其他语言如C,a,b,c应为2,但在python中,没有像引用这样的东西,所以改变abc所有值的唯一方法是a = b = c = 2据我所知,这就是为什么要获得对象的所有引用。

7 个答案:

答案 0 :(得分:10)

正如你所看到的,找不到它们是不可能的。

>>> sys.getrefcount(1)
791
>>> sys.getrefcount(2)
267
>>> sys.getrefcount(3)
98

答案 1 :(得分:7)

我想在这里澄清一些错误信息。这与“整体不可变”这一事实并没有任何关系。当您撰写a = 2时,您将aa单独分配给不同的内容 - 它对bc无效。

但是,如果您要修改a属性,那么影响bc。希望这个例子更能说明我在说什么:

>>> a = b = c = [1]  # assign everyone to the same object
>>> a, b, c
([1], [1], [1])
>>> a[0] = 2         # modify a member of a
>>> a, b, c
([2], [2], [2])      # everyone gets updated because they all refer to the same object
>>> a = [3]          # assign a to a new object
>>> a, b, c
([3], [2], [2])      # b and c are not affected

答案 2 :(得分:4)

我想你可能对objgraph感兴趣。它允许您遍历内存中的对象图,或转储对象图的PNG。它对调试内存泄漏非常有用。

请参阅此页:http://mg.pov.lt/objgraph/

答案 3 :(得分:2)

你所问的不是很实际,也是不可能的。这是一种疯狂的方式:

>>> a = 1
>>> b = a
>>> c = b
>>> locals()
{'a': 1, 'c': 1, 'b': 1, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, '__name__': '__main__', '__doc__': None}
>>> [key for key, value in locals().items() if value == 1]
['a', 'c', 'b']
>>> globals()
{'a': 1, 'c': 1, 'b': 1, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, '__name__': '__main__', '__doc__': None}
>>> [key for key, value in globals().items() if value == 1]
['a', 'c', 'b']

答案 4 :(得分:2)

在Python中找不到对给定对象的所有引用是不可能的。甚至无法在Python中找到所有对象或所有引用。 (CPython函数gc.get_objects执行此操作,但它不能在Python实现中移植。)

您可以使用dir()locals()查找程序中某个范围内存在的所有变量。但是如果在其他地方定义了对象,你可能会错过这种方法。

答案 5 :(得分:1)

首先在C中,“=”是一个值赋值,不会创建引用。更具体地说,当你写a = b = 1时会发生什么。

(1)b = 1得到评估,将1分配给b然后返回1,所以表达式变为a = 1

(2)a = 1得到评估,将1分配给b,然后返回1,不在任何地方使用。

然后a = 1仅按预期更改a。

在python中,事情有点复杂,因为每个变量都是一个引用,但它对数字的处理方式不同,因为它们是不可变的。总之,当你写a = 1和b = 1时,a是b返回True。但换一个不会改变另一个。

然而,对象不会发生这种情况,并且它们的引用按预期工作。因此,如果您想要执行您所描述的内容,您可能应该定义一个包含所需值的新对象,并将其分配给变量。

答案 6 :(得分:0)

看看pyjack。它的replace_all_refs函数似乎可以很好地替换对象的所有引用。注意:对字符串对象不起作用。