为什么变量在循环外表现不同?

时间:2014-08-24 13:53:43

标签: python function if-statement while-loop

如果我运行此代码:

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变量?

非常感谢任何帮助。谢谢。 :)

3 个答案:

答案 0 :(得分:1)

您将number声明为

number = int(string[count])

所以当

count = 0

这意味着number将是您的字符串的第一个字符(位置[0])转换为int。如果您不在循环中更新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会发生什么。< / p>

答案 1 :(得分:1)

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

在循环中使用number = int(string[count]),每次number重新分配index count元素的值,以便每次都获得输入字符串的不同部分。

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

答案 2 :(得分:1)

我知道你是初学者。这是一个重写,可以帮助你使用一些有用的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 一个存储桶,以便将后续数字小于{{1进入:

number

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

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

[5, []] number4时,它们会被正确添加:

3

这是怎么发生的?这段代码就是这样做的:

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

此处我们不附加 else: final_list[-1].append(number) ;我们追加到final_listfinal_list中的最后一个列表。

但是如果我们的序列只是final_list[-1]怎么办?然后在循环结束时,5看起来像这样:

final_list

在这种情况下,我们想要删除所有空列表,所以我们这样做:

[5, []]

这就是说,&#34;将final_list变成一个包含final_list所有元素的列表,除了那些是空列表的元素。&#34;

学习python祝你好运。我希望你觉得它很有意义。