10
>>> b = []
>>> c = '1234'
>>> b += c
>>> b
['1', '2', '3', '4']
>>> 

ここで何が起きてるの?これはうまくいかないはずですよね?それとも、明らかな何かが欠けていますか?

>>> b = []
>>> c = '1234'
>>> b + c
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    b + c
TypeError: can only concatenate list (not "str") to list
>>> 

次に、常に?a += b と同等であるとは限りません。a = a + b

4

7 に答える 7

15

文字列は反復可能です。要素は文字列の文字です。iterableをリストに追加すると、iterableの要素がリストに追加されます。

次のいずれかが期待どおりに機能します(つまり、文字列を追加し、文字列の文字でリストを拡張しません)。

b += [c]

また

b.append(c)
于 2011-11-30T08:04:40.437 に答える
10

+=演算子、リストを追加する代わりに、リストを拡張します。

>>> b = []
>>> c = "1234"
>>> b.append(c)
>>> b
['1234']
>>> b.extend(c)
>>> b
['1234', '1', '2', '3', '4']
>>> b += c
>>> b
['1234', '1', '2', '3', '4', '1', '2', '3', '4']
>>> b += [c]
>>> b
['1234', '1', '2', '3', '4', '1', '2', '3', '4', '1234']
于 2011-11-30T08:04:58.327 に答える
3

これは、元の質問(適切に回答されたと思います)に対する回答ではなく、拡張割り当てのセマンティクス(+=および同様の操作)に関するコメントで尋ねられた多数の質問に対する回答です。

簡単に言うと、拡張代入は、可変型と不変型では動作が異なります。

str、、tupleおよび数値型は、とりわけ不変です。タプルの内容は、一度作成すると変更できないため、次のように動作します。

>>> a = (1, 2)
>>> b = a
>>> a += (3, 4)
>>> a
(1, 2, 3, 4)
>>> b
(1, 2)

str同じセマンティクスを持っています。基本的に、ifが不変である場合a += bと同等です。a = a + ba

を含む他のほとんどのタイプlistは変更可能です。リストの内容はその場で変更でき、拡張代入はまさにそれを行います。したがって:

>>> a = [1, 2]
>>> b = a
>>> a += [3, 4]
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3, 4]

一方、3行目を。に置き換えるとa = a + [3, 4]、新しいリストが作成され、bになります[1, 2]

ユーザー定義クラスの場合、セマンティクスはそれがどのように実装されたかによって異なりますが、これはPEP203に従って実行されることになっている方法です。

于 2011-12-01T00:45:11.370 に答える
2

文字列は文字のシーケンスです。リスト操作+=は任意のシーケンスを取り、シーケンスの各要素をリストに追加します。

(実際+=には反復可能です。)

于 2011-11-30T08:04:38.277 に答える
2

+= は拡張のシンタックス シュガーですが、+ は単なるリスト連結です。拡張すると、引数 (この場合は文字列) を反復処理します。ただし、文字列をリストに連結することはできないため、 + は失敗します。

于 2011-11-30T08:12:58.393 に答える
0

何を期待しましたか?cを文字列として追加する場合は、次のことを行う必要があります。

b.append(c)

乾杯!

于 2011-11-30T08:07:28.097 に答える
0

基本的に、リストの += 演算子は c の反復子を取得し、個々の文字を順番に返します。実際の文字列をリストに追加して結果 ['1234'] を生成する場合は、代わりに b.append('1234') を使用できます。

于 2011-11-30T08:10:27.533 に答える