2017-02-09 2 views
0

私は期待どおりに動作するチェックサムプログラムをやっています。しかし、print文だけの行のコメントを外すと結果が変わります。おそらくレイヤー8のエラーですが、これはとても奇妙です。イテレータを印刷すると、イテレータが変更されるのはなぜですか?

#!/usr/bin/env python3 
string="foobarbaz" # Only as an example. 

characters = string.encode('ISO-8859-1') 
iterator = zip(characters[1:], characters) 
iteratora = zip(characters[1::2], characters[::2]) 
iteratorb = zip(characters[2::2], characters[1::2]) 
# print(list(iterator)) 
# print(list(iteratora)) 
# print(list(iteratorb)) 
elements = [x + 2 * y if index % 2 else x * y 
      for index, (x, y) in enumerate(iterator)] 
hex((sum(elements) + characters[0]) % 0x10000) 

上記のコードは期待通りに動作し、次の値を返します。今

'0xac66' 

、私は最初の印刷行のコメントを解除したいので、コードは次のようになります。

#!/usr/bin/env python3 

string="foobarbaz" # Only as an example. 

characters = string.encode('ISO-8859-1') 
iterator = zip(characters[1:], characters) 
iteratora = zip(characters[1::2], characters[::2]) 
iteratorb = zip(characters[2::2], characters[1::2]) 
print(list(iterator)) 
# print(list(iteratora)) 
# print(list(iteratorb)) 
elements = [x + 2 * y if index % 2 else x * y 
      for index, (x, y) in enumerate(iterator)] 
hex((sum(elements) + characters[0]) % 0x10000) 

これが返されます:

'0x66' 

printステートメントのlist変換で元の値がiteratorに変更されていますか?これは起こらないと思う。

答えて

3

list(iterator)はイテレータを消費します。したがってprint(list(iterator))のコメントを解除したときに、elementsは空のリストになりますと比較すると

string = "foobarbaz" 
characters = string.encode('ISO-8859-1') 
iterator = zip(characters[1:], characters) 
print(list(iterator)) 
# [(111, 102), (111, 111), (98, 111), (97, 98), (114, 97), (98, 114), (97, 98), (122, 97)] 

elements = [x + 2 * y if index % 2 else x * y 
      for index, (x, y) in enumerate(iterator)] 

print(elements) 
# [] 

string = "foobarbaz" 

characters = string.encode('ISO-8859-1') 
iterator = zip(characters[1:], characters) 
elements = [x + 2 * y if index % 2 else x * y 
      for index, (x, y) in enumerate(iterator)] 
print(elements) 
# [11322, 333, 10878, 293, 11058, 326, 9506, 316] 

あなたがiteratorを印刷したい場合は、あなたがそれをdeepcopy必要があります。

import copy 

. 
. 
print(list(copy.deepcopy(iterator))) 
. 
. 

別のアプローチですそれを印刷しようとする前にiteratorにリストするようにしてください:

. 
. 
iterator = list(zip(characters[1:], characters)) 
print(iterator) 
# [(111, 102), (111, 111), (98, 111), (97, 98), (114, 97), (98, 114), (97, 98), (122, 97)] 
elements = [x + 2 * y if index % 2 else x * y 
      for index, (x, y) in enumerate(iterator)] 

print(elements) 
# [11322, 333, 10878, 293, 11058, 326, 9506, 316] 
+0

間違いなく、巨大なレイヤー8のエラーです。私は愚かな気持ちになる。私はすべてのSEルールをスキップして、**ありがとうございます!**。今それは明らかです(解決策を知った後)。 – Helio

関連する問題