Python Copy Through Assignment?

2019-01-02 15:41发布

I would expect that the following code would just initialise the dict_a, dict_b and dict_c dictionaries. But it seams to have a copy through effect:

dict_a = dict_b = dict_c = {}
dict_c['hello'] = 'goodbye'

print dict_a
print dict_b
print dict_c

As you can see the result is as follows:

{'hello': 'goodbye'}
{'hello': 'goodbye'}
{'hello': 'goodbye'}

Why does that program give the previous result, When I would expect it to return:

{}
{}
{'hello': 'goodbye'}

标签: python
4条回答
听够珍惜
2楼-- · 2019-01-02 16:02

This is because in Python, variables (names) are just references to individual objects. When you assign dict_a = dict_b, you are really copying a memory address (or pointer, if you will) from dict_b to dict_a. There is still one instance of that dictionary.

To get the desired behavior, use either the dict.copy method, or use copy.deepcopy if your dict may have nested dicts or other nested objects.

>>> a = {1:2}
>>> b = a.copy()
>>> b
{1: 2}
>>> b[3] = 4
>>> a
{1: 2}
>>> b
{1: 2, 3: 4}
>>> 
查看更多
人间绝色
3楼-- · 2019-01-02 16:09

Even though

>>> dict_a, dict_b, dict_c = {}, {}, {}

is the right way to go in most cases, when it get more than 3 it looks weird

Imagine

>>> a, b, c, d, e, f = {}, {}, {}, {}, {}, {}

In cases where I wanna initialize more than 3 things, I use

>>> a, b, c, d, e, f, = [dict() for x in range(6)]

Caution: Do not use [{} for x in range(6)]

查看更多
荒废的爱情
4楼-- · 2019-01-02 16:12

Your first assignment assigns the same dictionary object to the variables dict_a, dict_b, and dict_c. It is equivalent to dict_c = {}; dict_b = dict_c; dict_a = dict_c.

查看更多
姐姐魅力值爆表
5楼-- · 2019-01-02 16:14

As danben previously said, you're just copying the same dict into 3 variables, so that each one reffers to the same object.

To get the behaviour you want, you should instanciate a different dict in each variable:

>>> dict_a, dict_b, dict_c = {}, {}, {}
>>> dict_c['hello'] = 'goodbye'
>>> print dict_a
{}
>>> print dict_b
{}
>>> print dict_c
{'hello': 'goodbye'}
>>>
查看更多
登录 后发表回答