python中非序列类型期望值拷贝的解决方案

看下面这段代码:

# -*- 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)

if __name__ == "__main__":
    str_cmd = "first"
    print "最开始的地址: ", id(str_cmd)
    test = Son(str_cmd)
    test.set_value()
    test.print_value()
    test.Son_print()

# -*- 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)
        <span style="color:#ff0000;">self.str_cmd = self.get_value()</span>
        print "Son中get_value之后的地址", id(self.str_cmd)

if __name__ == "__main__":
    str_cmd = "first"
    print "最开始的地址: ", id(str_cmd)
    test = Son(str_cmd)
    test.set_value()
    test.print_value()
    test.Son_print()

代码意图是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中非序列类型期望值拷贝的解决方案,布布扣,bubuko.com

时间: 2024-10-19 17:18:26

python中非序列类型期望值拷贝的解决方案的相关文章

Python的序列类型——字典

字典 字典dict,存储的元素是一种无序的键值对(K-V),字典的K值为任意不可变数据类型(如:字符串. 数字.元组),V值为任意数据类型.在计算机内部保存数据的时候是用哈希表表示的,列表不支持转化为 哈希表的原因是K是变化的(列表的可以增.删.改),而元组却可以用哈希表表示.由于它的无序性,使 得它不能像列表那样使用切片.但是我们能对字典的中的K—Y值进行更改.使用for循环时(不能使用while), 默认之只输出K值,不输出V值.当然,在字典中也提供了相应的内置函数弥补这个缺陷. 还有一点需

Python学习之通用序列类型数据详解

本文和大家分享的主要是python通用序列类型数据的相关操作,一起来看看吧,希望对大家学习python有所帮助. Python的序列,Python有6种内建的序列,包括:列表.元组.字符串.Unicode字符串.buffer对象和xrange对象.其中最为常用的是Python的列表和元组. Python的序列 Python有6种内建的序列,包括:列表.元组.字符串.Unicode字符串.buffer对象和xrange对象.其中最为常用的是Python的列表和元组. Python序列的应用 Pyt

Python基本语法_基本数据类型_序列类型详解

目录 目录 序列 序列的标准操作符 切片操作符 一个例子 序列的功能函数 enumerate 枚举出序列对象的元素 len 获取序列对象的长度 min 取出sequence中的最小值 max 取出sequence中的最大值 reversed 返回一个逆序访问的迭代器 sorted 序列的排序 sum 计算序列中的各项元素和 zip 混合两个序列对象 all 检测sequence中各项元素是否均为True any 检测序列中的任意元素是否为True 序列 序列是一类基本数据类型(字符串/列表/元组

python 序列类型

1.不可变的序列类型:tuple.range.str.set 001:对于tuple 类型有如下几种构造方式 1.() 构造一个空的元组. 2.a | (a,) 构造一个只有一个元素的元组. 3.tuple('1') 使用内置的tuple方法构造. 4.(1,2,3) 使用字面值的方法来构造一个元组. 002:对于range就没有这么多的花样了,只有一个构造方法可用 range(起始索引,结束索引,步长) 003:str 也没有太多的花样:它主要用字面值来构造,这些字面值可以用单引号,双引号,三

Python 列表API 序列类型 &nbsp; 列表生成

列表API: 1.pop( )  :按照索引弹出元素,返回值为该元素.默认弹出最后一个元素: 例如:a=[1,2,3]; print(a.pop()); 输出结果是3 pop(正值) 从索引位置 pop(负值) 从列表倒数位置开始指定下标 2.remove( ):按照元素值弹出第一个匹配项,返回新列表 lists=[123,'xyz','zara','abc','xyz']   xyz元素从列表中移除  abc弹出 结果是:[123,'zara','abc'] abc 例如: lists=[12

Python的数值类型与序列类型

先说一下基本学习要用的一些基本软件: 1.vmware,和virtualbox,:是两款虚拟软件,用于创建虚拟机供使用. 2.ubuntu:一款基于Linux开发的操作系统. 3.Python:Python里面包含的Python解释器. 4.xshell:远程连接控制软件. 5.pycharm:专门为Python开发的一款IDLE. 这个几个软件或者说工具,需要进行配合才能使程序运行起来,配合需要相互配置,相互协调,这个是个难点,需要多加练习. 程序就是需要多加练习,多加学习才能完全去了解他们,

6、python基本数据类型之序列类型

前言:python的基本数据类型可以分为三类:数值类型.序列类型.散列类型,本文主要介绍序列类型及其通用操作 一.序列类型 1)字符串(str):用单引号('),双引号("),三引号(三单引号'''或三双引号""")来表示 2)列表(list):用[ ]中括号表示 3)元组(tuple):用()小括号表示 二.字符串str 1.定义 字符串定义:单引号.双引号.三引号.str() 引号都是成对出现 空字符串:s ='' (单引号对里没有任何数据) 空字符:s ='

《转》python学习(6)序列类型-字符串

转自 http://www.cnblogs.com/BeginMan/archive/2013/06/08/3125502.html 二.序列类型 包含字符串.列表.元祖.模式都一样,举一反三即可.如: 1.成员关系操作符(in / not in ) 2.关于切片 1 2 3 4 5 6 s=[1,2,3,4] print s[::-1]     #下标范围[0,0],步长是-1,则从后(4,包括4)往前切取所有,输出:[4, 3, 2, 1] print s[::-2]     #下标范围[0

Python学习笔记 | 变量 + 引用 + 拷贝 + 作用域

在Python中,变量是没有类型的,在使用变量的时候,不需要提前声明,只需要给这个变量赋值即可.但是,当用变量的时候,必须要给这个变量赋值:如果只写一个变量,而没有赋值,那么Python认为这个变量没有定义(not defined). 一.变量和对象 1. 可变对象和不可变对象 在Python中,对象分为两种:可变对象和不可变对象,不可变对象包括int,float,long,str,tuple等,可变对象包括list,set,dict等.需要注意的是:这里说的不可变指的是值的不可变.对于不可变类