【问题标题】:Python: For-loop won't finishPython:for循环不会完成
【发布时间】:2012-05-03 21:26:51
【问题描述】:

在我开始之前,让我先说我真的是编程新手,所以请不要杀了我。

作为练习,我编写了一个脚本,该脚本应该从 txt 中获取十六进制数字列表,将它们转换为十进制并将它们写入另一个文件。这是我想出的:

hexdata = open(raw_input("Sourcefile:")).read().split(',')
dec_data = []

print hexdata
x = -1
for i in hexdata:
    next_one = hexdata.pop(x+1)
    decimal = int(next_one, 16)
    print "Converting: ", next_one, "Converted:", decimal
    dec_data.append(decimal)

print dec_data

target = open(raw_input("Targetfile: "), 'w')
for n in dec_data:
    output = str(n)
    target.write(output)
    target.write(",")

当我运行脚本时,它会在没有错误的情况下完成,但它只会转换并写入我的源文件中的前 30 个数字并忽略所有其他数字,即使它们已加载到“hexdata”列表中。我尝试了几种变体,但它从不适用于所有数字(48)。我做错了什么?

【问题讨论】:

  • hexdata.pop(x+1) 好像很奇怪...

标签: python for-loop


【解决方案1】:

您的第一个循环尝试迭代 hexdata,同时使用 hexdata.pop() 将值从列表中拉出。只需将其更改为:

for next_one in hexdata:
    decimal = int(next_one, 16)
    print "Converting: ", next_one, "Converted:", decimal
    dec_data.append(decimal)

【讨论】:

  • 谢谢,我不知道这会导致问题。
【解决方案2】:

迭代列表的原则是不要修改您正在迭代的列表。如果必须,您可以复制列表以进行迭代。

for i in hexdata[:]: # this creates a shallow copy, or a slice of the entire list
    next_one = hexdata.pop(x+1)
    decimal = int(next_one, 16)
    print "Converting: ", next_one, "Converted:", decimal
    dec_data.append(decimal)

您还可以使用copy.deepcopy 创建深拷贝,这样可以避免浅拷贝中出现的问题,例如hexdata[:]

【讨论】:

  • 我想指出,hexdata[:] 不是深层副本(不是说你需要一个,但说它是一个会误导)。那是一个浅拷贝。对于深拷贝,您需要copy.deepcopy()。此外,即使对于浅拷贝,语法不明确的 list(hexdata)copy.copy(hexdata) 对于浅拷贝也会更好。
  • 你是对的@Lattyware,我会更新我的答案以反映这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
相关资源
最近更新 更多