我认为字典和列表在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!']
答案 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)
d
,l
,mydict
和mylist
是指向存在于内存中的对象的变量。记住变量和它指向的东西之间的区别非常重要。变量有点像代词一样工作。如果我指着一个罐头,然后说'#34;那就选择那个&#34;然后我指着一个盒子然后说#34;选择那个,&#34; &#34;即&#34;每次都指的是不同的东西。
当你说l = ['changed']
时,你告诉Python将变量指向别的东西,而这就是它所做的一切。这就像说#34;从现在开始,当我说l
时,我的意思是这个新列表:['changed']
。&#34;但它并没有改变指向的东西。
如果要更改对象,则需要使用对对象本身进行操作的技术,例如分配对象的键(l['0'] = 'changed'
)。
有些语言确实支持说&#34;任何引用此对象的内容现在应该引用另一个对象。&#34;但是,它似乎已经不合时宜了,因为我不知道如何以任何当前突出的语言来做这件事。
答案 2 :(得分:0)
您正在尝试分配,而不是更改列表/词典。要更改内容,您可以使用列表/字典方法。另一方面,您只是尝试分配新对象。
您可以使用的方法是:
append()
,remove()
,insert()
,extend()
,... update()
,clear()
,... 答案 3 :(得分:0)
你 RE 正在协助,而不是改变。
在一个函数中,scope
是不同的。