为何Python中列表赋值后修改原对象会影响新变量,整数赋值却不会?
Python中列表与整数赋值的行为差异解析
先看你给出的代码示例:
a = [1, 2] b = a a.append(3) print(b) # 输出 [1, 2, 3],表明b发生变化 c = 4 d = c c = 8 print(d) # 输出4,表明d未发生变化
这事儿说穿了就是Python里可变对象和不可变对象的核心区别,我给你唠明白:
- 首先得纠正一个常见误区:Python里的变量不是“装东西的盒子”,更像是贴在对象上的标签。
- 先聊列表的情况:
当你写a = [1,2]时,Python在内存里创建了一个列表对象[1,2],然后把标签a贴在了这个对象上。
执行b = a的时候,并没有复制这个列表,只是给同一个列表对象多贴了一个标签b——现在a和b指向的是完全同一个内存地址里的列表。
调用a.append(3)的时候,你是在直接修改这个列表对象本身的内容,不是给a换一个新列表。所以不管你通过a还是b去访问这个列表,看到的都是修改后的结果,毕竟它们指的是同一个东西嘛。 - 再看整数的情况:
c = 4是创建了整数对象4,把标签c贴上去。d = c同样是给这个4加了个新标签d。
但整数属于不可变对象——你没法直接修改4这个对象本身的值。当你执行c = 8时,其实是Python创建了一个全新的整数对象8,然后把标签c从原来的4上撕下来,重新贴到8上。而d还稳稳贴在原来的4上,所以print(d)输出的还是4。
简单总结:
- 像列表、字典、集合这类可变对象,赋值操作是让多个变量共享同一个对象,修改对象的内容会影响所有指向它的变量。
- 像整数、字符串、元组这类不可变对象,你没法修改原对象本身,赋值操作本质是给变量重新绑定到新对象,旧的变量不会受到影响。
内容的提问来源于stack exchange,提问作者RW Kang
相关产品推荐
相关产品推荐

