for 循环中变量抽象失败

发布于 2024-08-18 12:30:54 字数 1104 浏览 6 评论 0原文

我正在尝试用 Python 制作一个 4x4 数独解算器(我只是一个初学者!),在尝试定义一个函数来稍微清理我的代码时,我遇到了一些我不太理解的奇怪行为。显然,这之间有区别:

sudoku = "0200140000230040"

sudoku = map(lambda x: '1234' if x=='0' else x, list(sudoku))
for i in range(16):
    for j in range(4):
        if sudoku[i] == str(j+1):
            for k in range(4):
                if len(sudoku[i/4*4+k]) > 1:
                    sudoku[i/4*4+k] = sudoku[i/4*4+k].translate(None, str(j+1))
            for k in range(4):
                if len(sudoku[4*k+i%4]) > 1:
                    sudoku[4*k+i%4] = sudoku[4*k+i%4].translate(None, str(j+1))

和这个:

sudoku = "0200140000230040"

def sd(l):
    for k in range(4):
        if len(sudoku[l]) > 1:
            sudoku[l] = sudoku[l].translate(None, str(j+1))

sudoku = map(lambda x: '1234' if x=='0' else x, list(sudoku))
for i in range(16):
    for j in range(4):
        if sudoku[i] == str(j+1):
            sd(i/4*4+k)
            sd(4*k+i%4)

奇怪的表达式用于检查行和列(框尚未完成)。如果已经有人问过这种问题,我非常抱歉浪费您的时间,但请尝试运行这两个代码片段并观察您得到的不同结果。提前致谢。

(我有一种奇怪的感觉,我会被骂。哈。)

I'm trying to make a 4x4 sudoku solver in Python (I'm only a beginner!) and while trying to define a function to clean up my code somewhat, I ran across some strange behavior I don't really understand. Apparently, there's a difference between this:

sudoku = "0200140000230040"

sudoku = map(lambda x: '1234' if x=='0' else x, list(sudoku))
for i in range(16):
    for j in range(4):
        if sudoku[i] == str(j+1):
            for k in range(4):
                if len(sudoku[i/4*4+k]) > 1:
                    sudoku[i/4*4+k] = sudoku[i/4*4+k].translate(None, str(j+1))
            for k in range(4):
                if len(sudoku[4*k+i%4]) > 1:
                    sudoku[4*k+i%4] = sudoku[4*k+i%4].translate(None, str(j+1))

And this one:

sudoku = "0200140000230040"

def sd(l):
    for k in range(4):
        if len(sudoku[l]) > 1:
            sudoku[l] = sudoku[l].translate(None, str(j+1))

sudoku = map(lambda x: '1234' if x=='0' else x, list(sudoku))
for i in range(16):
    for j in range(4):
        if sudoku[i] == str(j+1):
            sd(i/4*4+k)
            sd(4*k+i%4)

The strange expressions are for checking the rows and columns (boxes aren't finished yet). I'm terribly sorry for wasting your time if this kind of thing has been asked already, but try running both code snippets and observing the different results you get. Thanks in advance.

(I have this weird feeling I'm going to get yelled at. Huh.)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

随风而去 2024-08-25 12:30:54

有区别...他们因两个不同的错误而失败!

第一个给了我这个错误:

  File "test.py", line 9, in <module>
    sudoku[i/4*4+k] = sudoku[i/4*4+k].translate(None, str(j+1))
TypeError: expected a character buffer object

第二个给了我这个错误:

  File "test.py", line 12, in <module>
    sd(i/4*4+k)
NameError: name 'k' is not defined

我认为主要问题是你假设“i/4*4+k”的表达式树将作为参数传递给函数,但实际上它是在函数调用之前进行评估,但由于 k 未定义而失败。您可以使用它:

    sd(lambda k: i/4*4+k)

在函数 sd 中,您可以用对 l(k) 的调用替换 l。现在,两个程序都会出现相同的错误。

There is a difference... they fail with two different errors!

The first gives me this error:

  File "test.py", line 9, in <module>
    sudoku[i/4*4+k] = sudoku[i/4*4+k].translate(None, str(j+1))
TypeError: expected a character buffer object

The second gives me this error:

  File "test.py", line 12, in <module>
    sd(i/4*4+k)
NameError: name 'k' is not defined

I think the main problem is you assume that the expression tree for 'i/4*4+k' will be passed as a parameter to the function, but actually it is evaluated before the function call is made and this fails because k is not defined. You could use this instead:

    sd(lambda k: i/4*4+k)

and inside the function sd you can replace l with calls to l(k). Now you get the same error for both programs.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文