3

Python文字列と文字列リテラルへのC文字配列の割り当てを関連付けようとしていました。例えば:

char* word="Hello";
        word="Now";

読み取り専用メモリ位置に配置された文字列「Hello」に割り当てます。そして、単語の「Now」への再割り当ては、文字配列に「Now」に対応するメモリ位置が割り当てられることを意味します。

Pythonでは、偶数(および明らかに文字列)は、値2のメモリ位置が割り当てられ、次に値3のメモリ位置が再割り当てされた場合と同じように機能するようです。

 a=2
 a=3

これは、ほとんどすべての変数割り当てについて、変数に割り当てられた値が含まれているCとは対照的です。私はここで良い比較をしていますか?

4

2 に答える 2

3

Cでは、char *「文字へのポインタ」タイプです。ポインタは、値自体へのアクセスを提供する「ハンドル」のようなものです。を割り当てるときword = "Now";は、文字列の文字ではなく、ハンドルを変更します。両方とも"Hello""Now"一定のストレージにバイトのグループとして存在します。

Pythonは、実行していることの多くを隠しますが、内部的には、組み込みの文字列参照は基本的にポインターのように機能します。したがって、あなたの観察はある程度まで正しいです。

これらの言語の文字列の大きな違いは、Pythonではすべての文字列が不変であるということです。Cを使用すると、(非定数)文字列内の文字を(割り当てによって)操作できます。例えば:

char word [] = "Hello";
// word is now the name of a 6-character (including final null) mutable string
word[0] = 'h';
// Now word has the value "hello".

Pythonでは、完全に新しい文字列を作成する必要があります。

word = 'h' + word[1:]

ここで、新しい文字列を構成するバイトは、のバイトとは異なりwordます。

Pythonには「参照セマンティクス」があるのは正しいです。すべてが、値ではなくハンドルを操作しているように動作します。

>>> a=[1]
>>> b=a
>>> a
[1]
>>> b
[1]
>>> a[0]=5
>>> a
[5]
>>> b
[5]

ここで、割り当てb = aはリストへのハンドルまたは参照をコピーしました。リスト自体はコピーされません。aの最初の要素を変更すると、も変更されるため、これは明らかですb

于 2012-08-13T01:46:49.423 に答える
0

char * は、word がポインター変数であることを意味します。文字列のアドレスは変数に配置され、文字列内の文字は移動しません。C の場合、ほとんどすべてではなく、すべての割り当てで値が変数に移動されます。この場合、アドレスは移動される値です。

Python はもう少し複雑です。変数を値にバインドするため、古い値を解放するなど、他の操作が舞台裏で発生する可能性があります。

于 2012-08-13T01:39:50.127 に答える