2012-08-13 110 views
3

我試圖將python字符串和C字符數組賦值到字符串文字之間的連接。 例如:python字符串和C字符數組之間的相似性

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

分配到放置在只讀存儲器位置上的字符字符串「Hello」。現在,將單詞重新分配到「Now」意味着現在字符數組被分配了與「Now」相對應的存儲位置。

在蟒偶數(顯然字符串)似乎類似於工作與被分配的存儲器位置具有值2,然後用值重新分配的存儲器位置3.

a=2 
a=3 

與此相反,C,其中對於幾乎所有的變量賦值,變量都包含賦值的值。我在這裏做一個很好的比較?

回答

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

+0

我在a和b的輸出中看不到任何更改。他們都打印[1]。你能澄清你的意思嗎? – joebalt 2012-08-13 01:49:18

+1

@Joe巴爾的摩:我修正了這個例子。我認爲吉恩有一個錯字。這是一個很好的例子。 +1 – dawg 2012-08-13 01:54:03

+0

@JoeBaltimore對不起,我編寫了錯誤。感謝您修復它。 – Gene 2012-08-13 01:57:19

0

char *表示word是指針變量。字符串的地址放在變量中,字符串中的字符不移動。對於C,所有賦值都將一個值移入變量,而不是幾乎全部。在這種情況下,地址是被移動的值。

Python稍微複雜一些。它將變量綁定到可能導致其他操作在幕後發生的值,如釋放舊值。

+0

是的,但它仍然很特殊,因爲在內存中分別創建了不可變字符串,然後將地址賦予給char *(而不是char var [],這使得可以使用相同語句更改字符串內容)變量。當它沒有被分配給一個字符串時,不是像int或甚至char *這樣的其他類型的賦值。 – vkaul11 2012-08-13 03:47:20