3

我试图在 python 字符串和 C 字符数组分配给字符串文字之间建立联系。例如:

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

分配给放置在只读存储器位置的字符串“Hello”。现在将单词重新分配给“Now”意味着现在为字符数组分配了一个与“Now”相对应的内存位置。

在 python 中,偶数(显然是字符串)似乎像这样工作,分配一个值为 2 的内存位置,然后重新分配一个值为 3 的内存位置。

 a=2
 a=3

这与 C 形成对比,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 回答