我试图将python字符串和C字符数组之间的连接分配给字符串文字。 例如:
char* word="Hello";
word="Now";
将字符串“Hello”分配给只读存储器位置。现在将字重新分配给“现在”意味着现在为字符数组分配对应于“现在”的存储位置。
在python中,偶数(显然是字符串)似乎就像那样被分配了一个值为2的内存位置,然后重新分配了一个值为3的内存位置。
a=2
a=3
这与C形成对比,对于几乎所有变量赋值,变量包含它所分配的值。我在这里做了一个很好的比较吗?
答案 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有点复杂。它将变量绑定到可能导致其他操作发生在幕后的值,例如释放旧值。