【问题标题】:Why is variable behaving differently outside loop?为什么变量在循环外表现不同?
【发布时间】:2014-10-17 19:22:40
【问题描述】:

如果我运行这段代码:

def numbers_in_lists(string):
    next_number = 0
    count = 0
    final_list = []
    while count < len(string):
        number = int(string[count])
        if number > next_number:
            final_list.append(number)
            new = []
            next_number = number
        else:
            new.append(number)
            if new not in final_list:
                final_list.append(new)
        count += 1
    print final_list


#testcases
string = '543987'
result = [5,[4,3],9,[8,7]]
print repr(string), numbers_in_lists(string) == result

我得到了这个答案:

'543987' [5, [4, 3], 9, [8, 7]]
False

但是如果我像这样将number 变量放在while 循环之外:

def numbers_in_lists(string):
    next_number = 0
    count = 0
    final_list = []
    number = int(string[count])
    while count < len(string):
        if number > next_number:
            final_list.append(number)
            new = []
            next_number = number
        else:
            new.append(number)
            if new not in final_list:
                final_list.append(new)
        count += 1
    print final_list

我得到了这个答案:

'543987' [5, [5, 5, 5, 5, 5]]
False

我是一个初学者,我到处寻找关于为什么number 变量在循环外表现不同的解释?另外,为什么其他变量在循环之外可以正常,而number变量不行?

任何帮助将不胜感激。谢谢你。 :)

【问题讨论】:

    标签: python function if-statement while-loop


    【解决方案1】:

    您将number 声明为

    number = int(string[count])
    

    那么当

    count = 0
    

    这意味着number 将是转换为int 的字符串的第一个字符(位置[0])。如果您不在循环中更新number,它将永远不会改变。在您的第一个代码版本中,number 在您的 while 循环中。

    while count < len(string):
        number = int(string[count])
        # more code
        count += 1
    

    注意在循环结束时,你增加count。这意味着在下一次迭代开始时,count 现在递增,因此number 将采用字符串中下一个字符的值。

    对于初学者来说,一个常见的误解是一个变量以某种方式“绑定”到另一个变量。例如:

    >>> a = 5
    >>> b = a
    >>> b
    5
    
    >>> a = 7
    >>> b
    5
    

    请看,即使a 将值从5 更改为7b 也不会更改,因为它没有以任何方式“绑定”到该变量。 b = a 这一行的意思是“从a 中取值并赋值给b”,之后b 不关心a 发生了什么。

    【讨论】:

      【解决方案2】:

      我知道你是初学者。这是一个重写,应该可以帮助您使用一些有用的 python 习惯用法和结构:

      def numbers_in_lists(string):
          numbers = [int(c) for c in string]
          next_number = -1
          final_list = []
          for number in numbers:
              if number > next_number:
                  final_list.append(number)
                  final_list.append([])
                  next_number = number
              else:
                  final_list[-1].append(number)
          final_list = [x for x in final_list if x != []]
          print final_list
      

      首先,当你有一个while-loop 和一个柜台时要保持警惕。您可以将其替换为迭代所有项目的for-loop

      由于这段代码操作的是整数,而不是字符串中的字符,让我们使用列表推导式一次性翻译它们:

      numbers = [int(c) for c in string]
      

      这将创建一个将所有字符转换为整数的列表。

      通过设置next_number = -1,我们确保numbers 中的所有数字都会更大。特别是,第一个元素会更大。

      当我们发现number 超过了上一个最大值next_number 时,我们添加number 一个桶来将小于number 的后续数字放入:

              if number > next_number:
                  final_list.append(number)
                  final_list.append([])
                  next_number = number
      

      这意味着当我们添加 5 时,final_list 看起来像这样:

      [5, []]
      

      number43 时,它们会被正确添加:

      [5, [4]]
      [5, [4, 3]]
      

      这是怎么发生的?这段代码做到了:

              else:
                  final_list[-1].append(number)
      

      这里我们不追加final_list;我们追加到final_listfinal_list[-1] 中的最后一个列表。

      但是如果我们的序列只是 5 呢?然后在循环结束时,final_list 将如下所示:

      [5, []]
      

      在这种情况下,我们想修剪掉所有空列表,所以我们这样做:

      final_list = [x for x in final_list if x != []]
      

      这就是说,“将 final_list 变成一个列表,其中包含 final_list 的所有元素,除了那些是空列表的元素。”

      祝你学习python好运。我希望你能从中受益。

      【讨论】:

        【解决方案3】:

        number = int(string[count]) 使用循环外分配的count 的值,即第一个字符index 0,它永远不会在循环外更改,因此您始终会获得附加的原始值,即第一个字符。

        在循环内使用number = int(string[count]),您每次都将number 重新分配给index count 处元素的值,这样您每次都会附加输入字符串的不同部分。

        一旦您输入while loop,您在循环外部定义的任何更改值都不会在该循环之外更改,您必须重新分配循环内部的值.

        【讨论】:

        • 您好,感谢您的回答。我不明白的是我正在更改在循环之外定义的计数值。所以我不明白为什么 number 也不会改变值,如果 count 改变了值。
        • 是的,但你只在循环外为 number 赋值,count 可能会在循环内改变,但你在循环外分配的 number 的值不会
        猜你喜欢
        • 1970-01-01
        • 2016-08-31
        • 1970-01-01
        • 2016-05-12
        • 2016-06-05
        • 1970-01-01
        • 2011-03-14
        • 1970-01-01
        • 2018-09-21
        相关资源
        最近更新 更多