2010-08-12 186 views
1

Lists -B = A對B = A [:]在串|列出

我可以隨時檢查b=a指向同一個對象,並c=a[:]創建另一個副本。

>>> a = [1,2,3,4,5] 
>>> b = a 
>>> c = a[:] 
>>> a[0] = 10 
>>> b 
[10, 2, 3, 4, 5] 
>>> c 
[1, 2, 3, 4, 5] 

Strings -

我不能做出改變到原來一成不變的字符串。我如何確認自己b=a使b指向相同的對象,而c = a[:]創建字符串的新副本?

+1

你想完成什麼,需要這個功能?如果你不能對字符串進行更改,那麼你是否總是使用相同的副本是否重要? – 2010-08-12 08:30:52

回答

2

您可以使用is運算符。

a = 'aaaaa' 
b = 'bbbbb' 

print a is b 
a = b 
print a is b 

c = a[:] 
print c is a 

這工作,因爲a is b當且僅當id(a) == id(b)。至少在CPython中,id(foo)只是存儲foo的內存地址。因此,如果foo is bar,那麼foo和bar實際上是相同的對象。有意思的是

a = 'aaaaa' 
b = 'aaaaa' 
a is b 

True。這是因爲python實際上(至少大部分)字符串,以至於它不會浪費存儲相同字符串兩次的內存,更重要的是可以通過比較C實現中的固定長度指針來比較字符串,而不是逐字節比較字符串。

+0

'print c is a'給了我'真'(當時期待'False':'c'是'a'的副本,存儲在別處,所以'c'和'a'不應該是同一個對象)。 – 2010-08-12 08:39:32

+0

@Vaibhav Bajpai python正在實習'a [:]'。因爲它是相同的字符串,所以沒有必要存儲它的兩個副本。 – aaronasterling 2010-08-12 08:41:14

+0

@Vaibhav Bajpai'a = [1,2,3]; b = a [:]'創建'a'的淺拷貝,因爲列表是可變的,因此有必要跟蹤可能對'b'所做的更改。字符串不可變。 – aaronasterling 2010-08-12 08:44:09

1

仍然可以在多個位置存儲相同的字符串 - 請參閱此示例。

>>> a="aaaaa" 
>>> b=a[:] 
>>> b is a 
True 
>>> b=a[:-1]+a[-1] 
>>> b is a 
False 
>>> b==a 
True 
>>> 
+0

很高興知道這一點。我經常想知道只是總是用'is'來檢查字符串。你知道爲什麼Python在這種情況下做到這一點嗎? – aaronasterling 2010-08-12 11:09:41

+0

@aaronasterling,字符串文字應該總是安全的。似乎構建的字符串並未經過測試。我不知道爲什麼這樣做。 – 2010-08-12 12:00:50

+0

這是絕對*不安全的假設相同的字符串文字被存儲爲相同的字符串。在這種情況下,Python根本沒有保證。當前的CPython實現恰好在同一編譯單元中優化字符串文字,並且看起來像標識符的字符串文字被實現,但這些都只是實現的細節。 – Duncan 2010-08-12 13:04:30

相關問題