外部范围在外部范围内定义的变量值

时间:2016-07-09 06:18:23

标签: python global-variables

我做了关于对称方格的编码练习。

以下是指示: 如果第一行与第一列相同,则列表是对称的, 第二行与第二列相同,依此类推。写一个 procedure,symmetric,以列表作为输入,并返回 boolean如果列表是对称的,则为True;如果不是,则为False。

以下是Udacity编写的测试用例

print symmetric([[1, 2, 3],
           [2, 3, 4],
            [3, 4, 1]])  
->True

print symmetric([["cat", "dog", "fish"],
            ["dog", "dog", "fish"],
            ["fish", "fish", "cat"]])
-> True

print symmetric([["cat", "dog", "fish"],
           ["dog", "dog", "dog"],
           ["fish","fish","cat"]])
-> False

所以这是我的代码:

def symmetric(list1):
  i=0
  j=0
  if list1 == []:
    return True
  if len(list1) != len(list1[0]):
    return False
  while i<len(list1):
    while j<len(list1):
        if list1[i][j] !=list1[j][i]:
            return False
        j=j+1
    i=i+1
  return True

我认为它会起作用但是当udacity运行测试用例时,它表示这并没有通过[[&#39;代数&#39;,&#39;组合数据&#39;,& #39;图表&#39;],[&#39;组合&#39;,&#39;拓扑&#39;,&#39;设置&#39;],[&#39;图表&#39;,&# 39;拓扑&#39;,&#39;设置&#39;]]

当我改变&#34; j = 0&#34;的位置时进入第一个while循环,它实际上通过了测试用例

def symmetric(list1):
  i=0
  if list1 == []:
    return True
  if len(list1) != len(list1[0]):
    return False
  while i<len(list1):
    j=0
    while j<len(list1):
        if list1[i][j] !=list1[j][i]:
            return False

        j=j+1
    i=i+1
  return True

我以前曾经在java中编写代码,我不认为它在java中有很大的不同。但是,在python的情况下,这是因为局部变量与全局变量?非常感谢!

1 个答案:

答案 0 :(得分:0)

j在while循环的范围之外定义,因此当您在循环中递增j时,您将递增在外部作用域中定义的变量。

对于它的价值,这是一种稍微简洁的方法:

def symmetric(inval):
    return map(tuple, inval) == zip(*inval)

这是一种更为抒情的方式来编写你的方法

def symmetric(list1):
    i=0
    if not list1:
        return True
    if not set(map(len, list1)) == set([len(list1)]):
        return False

    for i in range(0, len(list1)):
        for j in range(0, len(list1)):
            if list1[i][j] !=list1[j][i]:
                return False
    return True

它还测试所有子列表的长度是否相同,并且该长度与顶级列表相同。