假设我有两个列表:
>>> l1=[1,2,3,4]
>>> l2=[11,12,13,14]
我可以将这些列表放入元组或字典中,看起来它们都是对原始列表的引用:
>>> t=(l1,l2)
>>> d={'l1':l1, 'l2':l2}
>>> id(l1)==id(d['l1'])==id(t[0])
True
>>> l1 is d['l1'] is t[0]
True
既然它们是参考,我可以改变l1
元组和字典中引用的数据也会相应变化:
>>> l1.append(5)
>>> l1
[1, 2, 3, 4, 5]
>>> t
([1, 2, 3, 4, 5], [11, 12, 13, 14])
>>> d
{'l2': [11, 12, 13, 14], 'l1': [1, 2, 3, 4, 5]}
包括我是否在字典中附加参考文献d
或元组中的可变引用t
:
>>> d['l1'].append(6)
>>> t[0].append(7)
>>> d
{'l2': [11, 12, 13, 14], 'l1': [1, 2, 3, 4, 5, 6, 7]}
>>> l1
[1, 2, 3, 4, 5, 6, 7]
如果我现在设置l1
对于新列表,原始列表的引用计数会减少:
>>> sys.getrefcount(l1)
4
>>> sys.getrefcount(t[0])
4
>>> l1=['new','list']
>>> l1 is d['l1'] is t[0]
False
>>> sys.getrefcount(l1)
2
>>> sys.getrefcount(t[0])
3
并追加或更改l1
没有改变d['l1']
or t[0]
因为它现在是一个新的参考。间接引用的概念是覆盖得相当好 http://docs.python.org/reference/datamodel.html#objects在 Python 文档中,但不完全。
我的问题:
是一个可变对象always参考?你可以吗always假设修改它会修改原始文件(除非您专门使用l2=l1[:]
一种习语)?
我可以在 Python 中汇总所有相同参考文献的列表吗?即,某些功能f(l1)
返回['l1', 'd', 't']
如果所有这些都指的是同一个列表?
我的假设是,无论如何,只要有一些参考,数据就仍然有效。
ie:
l=[1,2,3] # create an object of three integers and create a ref to it
l2=l # create a reference to the same object
l=[4,5,6] # create a new object of 3 ints; the original now referenced
# by l2 is unchanged and unmoved