歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Python中非序列類型期望值拷貝的解決方案

Python中非序列類型期望值拷貝的解決方案

日期:2017/3/1 9:42:18   编辑:Linux編程

看下面這段代碼:

# -*- 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 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved