为什么Python函数可修改外部list/dict却无法修改外部string?
为什么Python函数可以修改外部的
list或dict,却无法修改外部的string? 这问题问到点子上了,核心其实是Python里可变对象和不可变对象的区别,再结合作用域规则就完全能捋明白。
先看你第一个字符串的例子:
ttt = 'ttt' def setit(it): ttt = it print(ttt) def showit(): print(ttt) if __name__ == "__main__": setit("lsdfjlsjdf") showit()
string属于不可变对象——意思是它一旦创建就没法被修改。你在setit里写ttt = it的时候,根本不是在改外部的那个ttt字符串,而是在函数的局部作用域里新建了一个也叫ttt的变量,它和全局的ttt完全是两个独立的东西。所以showit打印的还是最初的全局字符串值。
再看第二个列表的例子:
aaa = [] def setit(it): ttt = it aaa.append(it) def showit(): print(aaa) if __name__ == '__main__': setit(123) showit() setit(234) showit()
list是可变对象,函数里的aaa.append(it)并没有创建新变量,而是直接对aaa指向的那个列表本身做修改——你是给这个已经存在的列表加元素,不是重新赋值一个新列表。这时候函数里的aaa和全局的aaa指向的是同一个对象,所以修改操作会直接同步到外部,showit自然能看到更新后的列表。
最后再提炼下关键区别:
- 不可变对象(
string、int、tuple等):没法修改对象本身,只能通过赋值生成新对象,函数里的同名赋值会创建局部变量,和外部无关。 - 可变对象(
list、dict、set等):可以直接修改对象内部内容,不需要重新赋值,操作的是同一个对象引用,因此外部能看到变化。
内容的提问来源于stack exchange,提问作者James Zhu
相关产品推荐
相关产品推荐

