2016-11-07 63 views
0

我試圖解決以下問題:爲什麼python創建一個變量指向另一個變量?

假設感染一所大學的數據庫和改變學生的AR (教務處)的病​​毒。經過一段時間後,已經發現由病毒產生的AR(ARV = x1 x2 x3 x4 x5 x6 x7 x8 x9) 正確的AR(ARC = y1 y2 y3 y4 y5 y6 y7 y8 y9)可以獲得 通過以下操作:

Y1 = X1,Y2 = X2,Y3 = X8,Y4 = X7,Y5 = X5,Y6 = 5233,Y7 = X3,Y8 = X4,Y9 = X9

例如,ARV = 197845602 - > ARC = 190645782

製作一個讀取ARV並給出ARC的程序。

我的代碼如下所示:

pt = input('Type the AR affected by the virus: ') 

arv = list(pt) 
arc = arv 

arc[2] = arv[7] 
arc[3] = arv[6] 
arc[6] = arv[2] 
arc[7] = arv[3] 

jarc = ''.join(arc) 
print('\nCorrect AR:',jarc) 

當您運行的代碼,你看到生成的ARC它不是上面的例子中的ARC。爲什麼?我找到了。 「arv」隨着「弧」而改變,它應該保持不變。

對我來說似乎是python創建了一個變量「arc」到「arv」的指針。任何人都可以解釋爲什麼發生這種情況?我該如何正確解決問題?

+0

這是一個學校作業嗎? – Olian04

+0

因爲在Python中賦值不會複製任何東西。 – BrenBarn

+0

它的一個大學作業@ Olian04 – Nelthar

回答

2

的解決方法是複製的,而不是列表描述符列表內容,:

arc = arv[:] 

arc = arv.copy() 

原因是這是如何定義語言。您可以閱讀各種Python站點的歷史記錄;完整的解釋超出了StackOverflow的通用範圍。

從更高的層面來看,這就是Python實現基本指針的方式:對象分配是指原始對象,而不是複製。這節省了僞造的對象重複:如果你想要一個新的副本,你必須明確分配更多的存儲空間。

請注意,您的原始,ARV,是 「一成不變」:這是一個Python的技術術語。列表是一個可變對象;一個元組是不可變的同源。

+0

感謝您的幫助!的xD – Nelthar

1

正確的事情做的是做一個副本:

arc = arv.copy() 
+0

感謝這個有用的答案xD – Nelthar

相關問題