设为首页 加入收藏

TOP

Python与C++引用不同的理解
2019-03-21 22:08:20 】 浏览:79
Tags:Python 引用 不同 理解

例子,这是我的两段根据先序序列创建二叉树的代码:


# 正确
pos = 0
def create(seq):
    global pos
    ch = seq[pos]
    pos += 1
    if ch == '#':
        return None
    else:
        temp = TreeNode(ch)
        temp.left = create(seq)
        temp.right = create(seq)
        return temp
 
seq = "abd###ce###"
root = create(seq)


还有这个:
# 错误
def create(root):
    global pos
    if(seq[pos]=='#'):
        root = None
        pos += 1
        return
    root = TreeNode(seq[pos])
    pos += 1
    root.left = None
    root.right = None
    create(root.left)
    create(root.right)


看起来只是有无返回值的区别,实际上第二段代码是错误的,其实从第二段代码的思路来说,在C++里面可以这样写:


void create(tree & t){
    char ch = str[pos++];
    if(ch=='#'){
        t = NULL;
        return;
    }
    t = new node;
    t->val = ch;
    create(t->left);
    create(t->right);
}


这就是Python中与C++的引用的区别了。
我是这样理解的:Python中对内存的使用更像是不可改变的,对于一个引用所指向的对象,如果我要修改值,那么会先新找一块内存,赋值,然后将引用指向这个新的内存块,这样就是修改了引用指向的位置,但是在C++中则是直接在引用所指向的内存块上改变,例如:


Python:
a = 1
print(id(a))
a = a+1
print(id(a))


# 输出
140708803374848
140708803374880


在C++中:


int t = 1;
int & a = t;
printf("%d    %d\n", &a, a);
a += 1;
printf("%d    %d\n", &a, a);


# 输出
7208712    1
7208712    2


所以,就像上面的第二段代码,我传入了创建的树根的引用,但是当树的结构发生改变的时候,实际上是改变了存储的位置,这样原本的函数外面创建的root引用指向的其实还是原来的空内存块(突然觉得好傻。。就像被偷光了,还在等一样。。。),但是C++的引用就是很倔强地只认那一块内存,所以就可以直接改变使用了。
关于Python中引用与对象的关系,还牵扯到一些内存之类的知识,例如:


a = 1
b = 1
print(id(a))
print(id(b))


# 输出
140708803374848
140708803374848


这里是因为Python中为了节省内存,会将一些短小的字符串以及数字进行缓存,这样就会节省这类对象的建立销毁的开销了。
其它的就还有关于可变数据对象(mutable)和不可变对象(immutable)了,这个我之前也记录过。总有些语言看起来很简单,但是实际上还是要好好理解的啊。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇matplotlib绘图库之Artist对象详解 下一篇Python使用matplotlib:subplot绘..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目