如果我运行此代码:
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
变量?
非常感谢任何帮助。谢谢。 :)
答案 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
更改为7
,b
也不会更改,因为它不会以任何方式“绑定”到该变量。行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, []]
为number
和4
时,它们会被正确添加:
3
这是怎么发生的?这段代码就是这样做的:
[5, [4]]
[5, [4, 3]]
此处我们不附加 else:
final_list[-1].append(number)
;我们追加到final_list
,final_list
中的最后一个列表。
但是如果我们的序列只是final_list[-1]
怎么办?然后在循环结束时,5
看起来像这样:
final_list
在这种情况下,我们想要删除所有空列表,所以我们这样做:
[5, []]
这就是说,&#34;将final_list变成一个包含final_list所有元素的列表,除了那些是空列表的元素。&#34;
学习python祝你好运。我希望你觉得它很有意义。