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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:06:18