当我使用dict
编写一些Python代码时,我发现了代码的以下行为:
In [1]: def foo(bar_dict):
...: print id(bar_dict)
...: bar_dict['new'] = 1
...: return bar_dict
...:
In [2]: old_dict = {'old':0}
In [3]: id(old_dict)
Out[3]: 4338137920
In [4]: new_dict = foo(old_dict)
4338137920
In [5]: new_dict
Out[5]: {'new': 1, 'old': 0}
In [6]: id(new_dict)
Out[6]: 4338137920
In [7]: old_dict
Out[7]: {'new': 1, 'old': 0}
In [8]: id(old_dict)
Out[8]: 4338137920
old_dict
函数中的new_dict
,bar_dict
和foo
都指向内存地址。内存中只存储了一个实际dict
对象,即使我在函数内传递dict
。
我想了解更多有关Python这种内存管理机制的细节,有谁可以给我一些好的参考资料来解释一下这个问题?另外,当我们在Python中使用list
,set
或str
时,是否有类似行为?
答案 0 :(得分:2)
Python名称只是存储在堆上的对象的引用。将对象传递给函数调用只是传入这些引用,将参数名称绑定到同一个对象。
您创建了一个字典对象,并将old_dict
绑定到该对象。然后,您将该名称传递给foo()
函数,将本地名称bar_dict
绑定到同一对象。然后在函数中操作该对象,并返回它。您在new_dict
中存储了对返回对象的引用,导致两个全局名称引用同一对象。