在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
。
我在a和b的輸出中看不到任何更改。他們都打印[1]。你能澄清你的意思嗎? – joebalt 2012-08-13 01:49:18
@Joe巴爾的摩:我修正了這個例子。我認爲吉恩有一個錯字。這是一個很好的例子。 +1 – dawg 2012-08-13 01:54:03
@JoeBaltimore對不起,我編寫了錯誤。感謝您修復它。 – Gene 2012-08-13 01:57:19