Python向2D列表指定位置插入元素时所有子列表同步修改问题排查
问题根源
你在创建二维列表时,所有子列表都指向了同一个内存对象:
- 你提前创建了子列表
b,后续循环时反复把同一个b添加到外层列表stworzona_tablica中,所有子列表本质是同一个引用,修改任意一个子列表的内容,所有子列表都会同步更新。 - 后续你直接把
stworzona_tablica同时赋值给tablica_gracza和tablica_komputera,这两个列表也指向同一个对象,修改其中一个另一个也会同步变动。
修复代码
import random as r liczba_statkow = 5 wielkosc_tablicy_x = 9 wielkosc_tablicy_y = 9 def tworzenie_tablicy(wielkosc_tablicy_x, wielkosc_tablicy_y): stworzona_tablica = [] for _ in range(wielkosc_tablicy_y): # 每次循环都创建新的子列表,避免引用同一个对象 b = ["*"] * wielkosc_tablicy_x stworzona_tablica.append(b) for row in stworzona_tablica: print(row) return stworzona_tablica # 玩家和电脑的列表分别创建,互不干扰 tablica_gracza = tworzenie_tablicy(wielkosc_tablicy_x, wielkosc_tablicy_y) tablica_komputera = tworzenie_tablicy(wielkosc_tablicy_x, wielkosc_tablicy_y) def umieszczanie_statkow_na_tablicy_komputera(tablica_komputera, liczba_statkow, wielkosc_tablicy_x, wielkosc_tablicy_y): print(" ") wspozedna_x = r.randint(0, wielkosc_tablicy_x-1) wspozedna_y = r.randint(0, wielkosc_tablicy_y-1) # 直接赋值即可,不需要先删再插 tablica_komputera[5][5] = "X" for row in tablica_komputera: print(row) umieszczanie_statkow_na_tablicy_komputera( tablica_komputera, liczba_statkow, wielkosc_tablicy_x, wielkosc_tablicy_y)
优化说明
- 列表修改不需要
del加insert两步操作,直接用tablica_komputera[y][x] = 目标值即可,效率更高逻辑更清晰。 - 去掉了不必要的全局变量声明,函数创建完列表直接return返回值使用,代码可维护性更强。
内容的提问来源于stack exchange,提问作者Michał Wisełka
相关产品推荐
相关产品推荐

