10

私はかなり熟読しましたが、私が理解しようとしている概念に対する明確な答えはありません.

Python では、次のようなリストを取得すると:

L1=['muffins', 'brownies','cookies']

次に、コードを使用して、リスト内のオブジェクト、つまり「マフィン」への最初のポインターを置き換えようとしました。

L1[0:1] = 'cake'

リストL1を取得します:

['c', 'a', 'k', 'e', 'brownies', 'cookies']

それでも、同じリストを取得して操作を実行した場合 (文字列ケーキの 4 つの要素を使用):

L1[0:4] = ['cake'] # presumably, it's now passing the string cake within a list? (it passed into the modified list shown above)

最初に望んでいた出力が得られます。

['cake', 'brownies', 'cookies']

その理由を正確に説明できる人はいますか?最初にケーキを「リスト」に入れずに取得すると、文字列が個々の文字に分割され、文字列への単一の参照ではなく、それらの文字への参照として保存されると想定しています...

しかし、私は完全にはわかりません。

4

3 に答える 3

15

2 つの重要なポイント:

  1. スライス代入は、右側の iterableを受け取り、スライスの要素を iterable によって生成されたオブジェクトに置き換えます。
  2. Python では、文字列は反復可能です。文字列を反復処理すると、その文字が生成されます。

したがって

L1[0:1] = 'cake'

L1の最初の要素をの個々の文字に置き換えます'cake'

最初の要素を string に置き換えるには'cake'、単純に次のように記述します。

L1[0] = 'cake'

または、スライス割り当て構文を使用します。

L1[0:1] = ['cake']
于 2012-06-05T18:22:38.127 に答える
7

スライスを指定すると、右側はリスト/タプルであると見なされます (実際には反復可能ですが、不特定の数の値を生成するジェネレーターには注意してください)。

リスト内の項目を置き換えるには、次を使用します。

my_list[0] = "cake"

(あなたもできる

my_list[0:1] = ["cake"]

本当にリストスライスを使用したい場合。

他のいくつかの関連する参考文献を次に示し ます

于 2012-06-05T18:22:30.830 に答える
3

文字列は、文字を格納するシーケンス コンテナーと考え​​てください。そのように割り当てを行おうとすると、文字列の各項目がリストに追加されます。最初に "cake" を独自の 1 要素リスト (L2 と呼びましょう) でラップすることにより、代わりに L2 の各要素を L1 に追加します。最も外側のシーケンスを超えてシーケンス コンテナーを再帰的に分割することはありません。

L1 = ['muffins', 'brownies','cookies']
L2 = ['cake']
L1[0:1] = L2
print L1
['cake', 'brownies', 'cookies']

これは、他のネストされたシーケンス オブジェクトにも当てはまります。次のように、さらにネストされたシーケンス オブジェクトを試してみてください。

L3 = [['pie', 'eclairs'], ['bacon', 'chocolate']]
L1[0:1] = L3
print L1
[['pie', 'eclairs'], ['bacon', 'chocolate'], 'brownies', 'cookies']

append()リスト内の順序/位置を気にしない場合は、使用でき、文字列が分割されることを心配する必要がないことにも注意してください。

L1 = ['muffins', 'brownies','cookies']
L1.append('cake')
print L1
['muffins', 'brownies', 'cookies', 'cake']
于 2012-06-05T18:56:00.997 に答える