所有
a = 1
b = a
c = b
现在我想获得一个标记为1
的对象列表,即[a, b, c]
。我怎么能这样做?
谢谢!
为什么我需要这个:
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据我所知,这就是为什么要获得对象的所有引用。
答案 0 :(得分:10)
正如你所看到的,找不到它们是不可能的。
>>> sys.getrefcount(1)
791
>>> sys.getrefcount(2)
267
>>> sys.getrefcount(3)
98
答案 1 :(得分:7)
我想在这里澄清一些错误信息。这与“整体不可变”这一事实并没有任何关系。当您撰写a = 2
时,您将a
和a
单独分配给不同的内容 - 它对b
和c
无效。
但是,如果您要修改a
的属性,那么将影响b
和c
。希望这个例子更能说明我在说什么:
>>> 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
。它对调试内存泄漏非常有用。
答案 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函数似乎可以很好地替换对象的所有引用。注意:对字符串对象不起作用。