简体   繁体   English

只有二维数组中的第一个数组被 function 更新

[英]Only the first array inside a 2D array being updated by function

I have written this code below to create a randomised sudoku puzzle grid:我在下面编写了这段代码来创建一个随机数独拼图网格:

import time
import random
import math

sudoLine = [0,0,0,0,0,0,0,0,0]

#Creating mainGrid, this is a blank sudoku grid which I will place the contents of the possibleNums array into in a random order for each line.
mainGrid = [

    [0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0],

]

possibleNums = [1,2,3,4,5,6,7,8,9]
i = 0

#Grabbing the length of the possibleNums array and reducing it by 1 to get the index position of the last element.
length = len(possibleNums) - 1

def LineFill(line,nums,count):
    length = len(nums) - 1
    i = 0
    while length > 0:
        length = len(nums) - 1
        r = random.randint(0,length)
        line[i] = nums[r]
        nums.pop(r)
        i += 1
    return line

n=0

This while loop is then below that, and cycles through mainGrid , changing the array that is being filled each time:然后这个 while 循环在其下方,并循环通过mainGrid ,每次都更改正在填充的数组:

while n in range(0,len(mainGrid)):
    mainGrid[n] = LineFill(mainGrid[n],possibleNums,i)
    n += 1

print(mainGrid)

When I run it, only the first line of the sudoku grid is filled, meaning only the first array in the list is being updated, even though the while loop should cycle through them all.当我运行它时,只有数独网格的第一行被填充,这意味着只有列表中的第一个数组被更新,即使 while 循环应该循环遍历它们。

Could someone please point out the error in my logic?有人可以指出我的逻辑错误吗?

Thanks.谢谢。

Your line nums.pop() is the problem.您的nums.pop()行是问题所在。 You are passing possibleNums as the LineFill argument nums .您将possibleNums作为LineFill参数nums传递。 So nums is just a reference to possibleNums .所以nums只是对possibleNums的引用。 After you've filled one line, possibleNums is an empty list.填完一行后, possibleNums是一个空列表。

If your intent is to randomly populate a grid of numbers with no duplicates on any given row, here's a much easier approach:如果您的意图是在任何给定行上随机填充没有重复的数字网格,这里有一个更简单的方法:

In [1]: import random

In [2]: [random.sample(range(1, 10), 9) for _ in range(9)]
Out[2]:
[[3, 9, 8, 1, 2, 5, 6, 4, 7],
 [6, 7, 3, 9, 2, 5, 8, 1, 4],
 [4, 1, 9, 2, 7, 3, 5, 6, 8],
 [3, 5, 9, 4, 2, 1, 7, 8, 6],
 [7, 2, 8, 6, 1, 9, 4, 5, 3],
 [1, 8, 5, 9, 4, 6, 2, 7, 3],
 [8, 7, 1, 9, 2, 5, 3, 4, 6],
 [7, 6, 1, 5, 4, 2, 9, 3, 8],
 [7, 8, 4, 2, 5, 1, 6, 3, 9]]

Note that this method doesn't produce a valid Sudoku solution (it's theoretically possible, but the odds are... not in your favor) -- but it doesn't seem like that's what you're trying to do anyway.请注意,这种方法不会产生有效的数独解决方案(理论上是可能的,但可能性是......对你不利)——但无论如何,这似乎不是你想要做的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM