字典和列表在传递给函数时显示为不可变

时间:2015-06-03 16:18:31

标签: python list dictionary immutability

我认为字典和列表在Python中是可变的。是什么解释了这种行为?

#!/usr/bin/python3                                                             

def change_list(l):
    l = ['changed!']

def change_dict(d):                                                            
    d = {'changed!'}

mydict = {'bob': ['blah', 5], 'asdf' : 'asdf'}                                 
change_dict(mydict)                                                            
print(mydict)                                                                  

mylist = ['hello', 'foo', 'bar']
change_list(mylist)
print(mylist)

输出:

$ python3 test3.py 
{'asdf': 'asdf', 'bob': ['blah', 5]}
['hello', 'foo', 'bar']

预期产出:

$ python3 test3.py 
{'changed!'}
['changed!']

4 个答案:

答案 0 :(得分:3)

也许是一张"图片"会有所帮助:

d = ['a', 'list']

#       d -> [ 0 , 1 ]
#             /    |
#           'a' 'list'

d.append('changed')

#       d -> [ 0 , 1 , 2 ]
#             /    |    \
#           'a' 'list' 'changed'

d[0] = 'my'

#       d -> [ 0 , 1 , 2 ]
#             /    |    \
#          'my' 'list' 'changed'

d = []

# [] <- d    [ 0 , 1 , 2 ]
#             /    |    \
#          'my' 'list' 'changed'

重新分配名称d(无论是在函数内部还是其他参数)不会影响之前引用的列表。

This很好地介绍了名称/标识符在Python中的工作方式,以及它与任务和不变性。

答案 1 :(得分:1)

dlmydictmylist是指向存在于内存中的对象的变量。记住变量和它指向的东西之间的区别非常重要。变量有点像代词一样工作。如果我指着一个罐头,然后说'#34;那就选择那个&#34;然后我指着一个盒子然后说#34;选择那个,&#34; &#34;即&#34;每次都指的是不同的东西。

当你说l = ['changed']时,你告诉Python将变量指向别的东西,而这就是它所做的一切。这就像说#34;从现在开始,当我说l时,我的意思是这个新列表:['changed']。&#34;但它并没有改变指向的东西。

如果要更改对象,则需要使用对对象本身进行操作的技术,例如分配对象的键(l['0'] = 'changed')。

有些语言确实支持说&#34;任何引用此对象的内容现在应该引用另一个对象。&#34;但是,它似乎已经不合时宜了,因为我不知道如何以任何当前突出的语言来做这件事。

答案 2 :(得分:0)

您正在尝试分配,而不是更改列表/词典。要更改内容,您可以使用列表/字典方法。另一方面,您只是尝试分配新对象。

您可以使用的方法是:

  • listsappend()remove()insert()extend(),...
  • dictionariesupdate()clear(),...

答案 3 :(得分:0)

RE 正在协助,而不是改变。

在一个函数中,scope是不同的。