6

組み込みsum()関数の動作を理解しようとしていますが、startパラメーターが私の心を蒸発させました:

  1. a=[[1, 20], [2, 3]]
    b=[[[[[[1], 2], 3], 4], 5], 6]
    >>> sum(b,a)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: can only concatenate list (not "int") to list
    >>> sum(a,b)
    [[[[[[1], 2], 3], 4], 5], 6, 1, 20, 2, 3]
    
  2. >>> a=[1,2]
    >>> b=[3,4]
    >>> sum(a,b)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: can only concatenate list (not "int") to list
    >>> sum(b,a)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: can only concatenate list (not "int") to list
    

私はこれに唖然としているだけで、何が起こっているのかわかりません。python ドキュメントの内容は次のとおりです: http://docs.python.org/library/functions.html#sum。これは、「開始が文字列でも整数でもない場合はどうなるか」についての説明はありません。

4

4 に答える 4

21

Sumはこのようなことをします

def sum(values, start = 0):
    total = start
    for value in values:
        total = total + value
    return total

sum([1,2],[3,4])のようなものを展開[3,4] + 1 + 2します。これは、数値とリストを一緒に追加しようとしていることがわかります。

リストの作成に使用sumするには、値はリストのリストである必要がありますが、startは単なるリストにすることができます。失敗した例では、リストにすべてのリストではなく、少なくともいくつかのintが含まれていることがわかります。

リストで合計を使用することを考える可能性のある通常のケースは、リストのリストをリストに変換することです。

sum([[1,2],[3,4]], []) == [1,2,3,4]

しかし、実際には遅くなるので、そうすべきではありません。

于 2012-08-30T17:36:22.267 に答える
5
a=[[1, 20], [2, 3]]
b=[[[[[[1], 2], 3], 4], 5], 6]
sum(b, a)

このエラーは、開始パラメーターとは何の関係もありません。リストには2つの項目がありますb。1つは、、もう1つ[[[[[1], 2], 3], 4], 5]6であり、listとintを一緒に追加することはできません。

sum(a, b)

これは追加しています:

[[[[[[1], 2], 3], 4], 5], 6] + [1, 20] + [2, 3]

これは問題なく機能します(リストをリストに追加するだけなので)。

a=[1,2]
b=[3,4]
sum(a,b)

これは追加しようとして[3,4] + 1 + 2いますが、これも不可能です。同様に、sum(b,a)を追加して[1, 2] + 3 + 4います。

開始が文字列でも整数でもない場合はどうなりますか?

sum文字列を合計することはできません。見る:

>>> sum(["a", "b"], "c")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sum() can't sum strings [use ''.join(seq) instead]
于 2012-08-30T17:36:02.907 に答える