You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:03:39