python字符串和C字符数组之间的相似性

时间:2012-08-13 01:25:54

标签: python c

我试图将python字符串和C字符数组之间的连接分配给字符串文字。 例如:

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

将字符串“Hello”分配给只读存储器位置。现在将字重新分配给“现在”意味着现在为字符数组分配对应于“现在”的存储位置。

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

 a=2
 a=3

这与C形成对比,对于几乎所有变量赋值,变量包含它所分配的值。我在这里做了一个很好的比较吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

char *表示word是指针变量。字符串的地址放在变量中,字符串中的字符不会移动。对于C,所有赋值都将值移入变量,而不是几乎全部。在这种情况下,地址是要移动的值。

Python有点复杂。它将变量绑定到可能导致其他操作发生在幕后的值,例如释放旧值。