Python 用于操作嵌套列表的函数

Python 用于操作嵌套列表的函数,python,Python,1) 如果我这样做: 我获得: 2) 但是如果函数“dibujar_cruz()”从另一个函数获取初始嵌套列表,如下所示: tablero =[] def construir_tablero(): size =int(input("Which is the size of the nested lists? ")) col=[] for x in range (size): col .append(" ") for b in range(size

1) 如果我这样做:

我获得:

2) 但是如果函数“dibujar_cruz()”从另一个函数获取初始嵌套列表,如下所示:

tablero =[]
def construir_tablero():
    size =int(input("Which is the size of the nested lists? "))
    col=[]
    for x in range (size):
        col .append(" ")
    for b in range(size):
        tablero.append(col)
    return (tablero)
print (construir_tablero())
def dibujar_cruz():
    x = 0
    size = len(tablero)
    for row in tablero:
        row [x]= "X"
        row[size-x-1]="X"
        x += 1    
    for l in tablero:
        print (" ".join(l))
dibujar_cruz()
我获得:

当我期望得到与第1点相同的星星时)

3) 如果我定义了调用前两个函数的第三个函数:

def construir_cruz():
    construir_tablero()
    dibujar_cruz()
construir_cruz()
我希望得到与1)中相同的星星,但我得到了一个错误:

。。。行[size-x-1]=“x”

索引器:列表分配索引超出范围


2)和3)中的结果对我来说是出乎意料的。为什么我要获得它们?

正如Ilja Everilä在评论中强调的那样,您的数组
tablero
包含同一数组
col
的X个副本,但这是一个引用副本,而不是值副本。因此,每次修改
tablero
中的一列时,更改都会出现在每一列中

解决方案是按值复制
col
。只要改变一下:

tablero.append(col)
致:

第3)点中的问题是,当重复该函数时

construir_cruz() 
它的内存中已经有一个tablero。 将tablero定义的位置更改为:


解决了这个问题,因为它在每次调用中都会重新定义tablero。

construir\u tablero
中,您会将对同一列表的引用重复附加到父列表(“表”)中。因为您的表实际上只包含一行,而且只包含了很多次,所以您需要用X完全填充它。
tablero.append(col[:])
construir_cruz() 
tablero = []    
def construir_tablero():
    size =int(input("Which is the size of the nested lists? "))
    col=[]
    for x in range (size):
        col .append(" ")
    for b in range(size):
        tablero.append(col)
   return (tablero)
def construir_tablero():
    tablero =[]
    size =int(input("Which is the size of the nested lists? "))
    col=[]
    for x in range (size):
        col .append(" ")
    for b in range(size):
        tablero.append(col)
    return (tablero)