Python列表引用问题:为何append操作同时修改两个子列表?
问题解析:Python列表修改时出现的引用共享问题
Hey there! Let's figure out why your code is behaving unexpectedly and how to fix it.
先看你的核心问题代码
from random import choice as rc cards = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 11] i = 0 player = [[9, 9]] player[i] = [player[i][0]] player.append(player[i]) # 这行是关键! print(player) # 此时player == [[9], [9]] player[i].append(rc(cards)) print(player) # 此时player == [[9, 10], [9, 10]]
为什么两个子列表同时被修改?
在Python中,列表是可变对象。当你执行player.append(player[i])时,你并没有创建一个新的[9]列表,而是把player[i]这个列表的引用添加到了player里。也就是说,player[0]和player[1]其实指向的是同一个内存中的列表对象——它们是同一个东西的两个"名字"而已。所以当你给player[i](也就是这个共享的列表)添加元素时,两个位置都会显示出这个变化。
如何实现仅修改第一个子列表?
你需要在添加的时候创建原列表的独立副本,而不是传递引用。这里有几种简单的方法:
- 使用列表的
copy()方法:player.append(player[i].copy()) - 使用
list()构造函数生成副本:player.append(list(player[i])) - 使用切片语法获取全部元素来创建副本:
player.append(player[i][:])
修改后的完整代码
from random import choice as rc cards = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 11] i = 0 player = [[9, 9]] player[i] = [player[i][0]] player.append(player[i].copy()) # 创建独立副本 print(player) # 此时player == [[9], [9]] player[i].append(rc(cards)) print(player) # 现在会得到[[9, 随机数], [9]],比如[[9, 10], [9]]
这样修改后,player[0]和player[1]就是两个完全独立的列表,修改第一个不会影响第二个啦。
内容的提问来源于stack exchange,提问作者Kühlhausvogel
相关产品推荐
相关产品推荐

