看下面這段代碼:
# -*- coding: utf-8 -*-
import copy
class Present(object):
def __init__(self, str_cmd):
self._str_cmd = str_cmd
print "進入Present時的地址:", id(self._str_cmd)
def set_value(self):
temp = "test_cmd"
self._str_cmd = copy.deepcopy(temp)
def get_value(self):
return self._str_cmd
def print_value(self):
# print self._str_cmd
print "在Present中被賦值後的地址:", id(self._str_cmd)
class Son(Present):
def __init__(self, str_cmd):
Present.__init__(self, str_cmd)
self.str_cmd = str_cmd
def Son_print(self):
print "Son中的當前地址: ", id(self.str_cmd)
self.str_cmd = self.get_value()
print "Son中get_value之後的地址", id(self.str_cmd)
代碼意圖是Son中的str_cmd在Present中值被改變,但是在Son中希望能看到這個改變。如果沒有標紅的這行,那麼程序執行結果如下:
最開始的地址: 39466208
進入Present時的地址: 39466208
在Present中被賦值後的地址: 39426752
Son中的當前地址: 39466208
Son中get_value之後的地址 39466208
在Son中看到的是39466208這個地址的內容,但是Present改變的是39426752,所以雖然名字一樣,但實際兩個類中看到的變量不是同一個。
如果加上紅色的這句,那麼結果變成:
最開始的地址: 39138528
進入Present時的地址: 39138528
在Present中被賦值後的地址: 39099072
Son中的當前地址: 39138528
Son中get_value之後的地址 39099072
這個時候get_value之後,Son和Present的str_cmd都已經指向了同一個Id,所以兩者看到的已經是同一個變量。
用以上方案可以實現非序列變量的值拷貝,對於序列變量的值拷貝,直接使用copy.deepcopy即可。
《Python核心編程 第二版》.(Wesley J. Chun ).[高清PDF中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm
《Python開發技術詳解》.( 周偉,宗傑).[高清PDF掃描版+隨書視頻+代碼] http://www.linuxidc.com/Linux/2013-11/92693.htm
Python腳本獲取Linux系統信息 http://www.linuxidc.com/Linux/2013-08/88531.htm
在Ubuntu下用Python搭建桌面算法交易研究環境 http://www.linuxidc.com/Linux/2013-11/92534.htm
Python 的詳細介紹:請點這裡
Python 的下載地址:請點這裡