为何列表ones在无关代码块执行后值发生变化?
为什么修改
twos里的列表会影响terms? 这事儿说穿了就是Python里可变对象的引用机制在搞鬼,我当初刚学Python的时候也踩过这个坑,给你掰扯清楚:
问题核心:列表是可变对象,append的是引用而非副本
在Python中,像列表这种可变对象,当你把它添加到另一个列表里(比如terms.append(ones)或者twos.append(ones)),你并没有复制一份ones的内容存进去,而是把指向ones这个列表在内存中位置的“指针”(也就是引用)加了进去。
看你的代码流程:
- 初始化
ones = [],然后循环3次每次给ones加个1,同时每次都把ones的引用添加到terms里。所以terms里的3个元素,其实全都是指向同一个ones列表的引用——到循环结束时,ones变成了[1,1,1],所以terms里的每个元素看起来都是[1,1,1]。 - 后面你把
ones的引用添加到twos里,然后修改twos[-1](本质就是修改那个引用指向的ones列表):弹出最后一个元素再改成2,这直接修改了内存里那个唯一的列表对象。 - 而
terms里的所有元素都是指向这个对象的引用,所以自然terms的内容也跟着变了。
怎么解决?
如果你想让terms里的每个元素都是独立的列表,而不是同一个引用,每次append的时候要传ones的副本,而不是原列表的引用。可以用这几种方式:
terms.append(ones.copy())terms.append(list(ones))terms.append(ones[:])
这样每次添加到terms里的都是一个新的列表,修改原ones或者其他列表都不会影响它们了。
内容的提问来源于stack exchange,提问作者HelloWorld4444
相关产品推荐
相关产品推荐

