为何第一种场景变量值改变,第二种却未变?是否因列表是全局变量?
代码示例
lst1 = [1, 2, 3, 14, 33, 1, 9] lst2 = lst1 lst2.append(789) print(lst1, lst2, sep='\n') a = 100 c = a c += 1 print(a)
问题
为何第一种情况中的变量发生了变化,第二种情况却没有?这是因为列表是全局变量吗?
解答
这和全局变量完全无关,核心是Python里可变对象与不可变对象的特性差异:
- 列表属于可变对象:执行
lst2 = lst1时,并没有复制出一个新列表,只是让lst2和lst1指向内存里同一个列表对象。所以用lst2调用append修改列表,本质是改动了这个共享的对象,lst1作为指向同一对象的变量,自然会同步看到变化。 - 整数属于不可变对象:
a = 100创建了一个整数对象,c = a让c指向这个对象。但执行c += 1时,因为整数对象无法被修改,Python会新建一个值为101的整数对象,然后让c指向这个新对象。原来的100对象没被改动,所以a的值还是100。
总结:可变对象的赋值是引用传递,修改操作会影响所有指向它的变量;不可变对象的赋值是值传递,修改操作会生成新对象,不会影响原变量。
内容的提问来源于stack exchange,提问作者Dionanin
相关产品推荐
相关产品推荐

