Python 防止变量被隐式改变

相关知识

Python 的变量类型

Python 的赋值机制

同级变量隐式改变

当两个变量指向同一个可变实例时,一个发生改变,另一个随之发生改变

>>> origin = []
>>> new = origin
>>> origin.append('new_value')
>>> print('origin value is: ', origin)
origin value is:  ['new_value']
>>> print('while new value is: ', new)
while new value is:  ['new_value']

这段代码里面,我只改变了origin的值,但是new的值也被改变了。

如何避免?

对可变类型永远使用copy

import copy
origin = []
new = copy.copy(origin)
origin.append('new_value')

print('origin value is: ', origin)
print('while new value is: ', new)

执行结果

origin value is:  ['new_value']
while new value is:  []

变量隐式改变指向

在同一级别的对象传递还容易被识别,但是如果是不同级别的对象传递呢?

def tricky_func(variable):
    variable.append('new_value')
    return variable


origin = []
new = tricky_func(origin)

print('new list should have the new_value: ', new)
print('but now the origin value also have it, which is not supposed: ', origin)

执行结果

new list should have the new_value:  ['new_value']
but now the origin value also have it, which is not supposed:  ['new_value']

你本希望new是一个全新的list,但是还是指向origin。非常要命的是,之后无论origin和new那个改变了值,都会引起另一个的改变。

如何避免?

调用函数的时候,使用copy之后再调用

import copy
def tricky_func(variable):
    variable.append('new_value')
    return variable

origin = []
new = tricky_func(copy.copy(origin))

print('new list should have the new_value: ', new)
print('now the origin is good: ', origin)

现在的执行结果

new list should have the new_value:  ['new_value']
now the origin is good:  []
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 3,226评论 2 9
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,792评论 1 32
  • 个人笔记,方便自己查阅使用 Py.LangSpec.Contents Refs Built-in Closure ...
    freenik阅读 67,975评论 0 5
  • 1.设计模式是什么? 你知道哪些设计模式,并简要叙述?设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型...
    龍飝阅读 2,322评论 0 12
  • “青春期”在成年人眼里是个回不去又美好的时期,可在家里的娃儿即将或已经步入青春期的孩爸孩妈心里,那应该是颗定时炸弹...
    13先生_阅读 267评论 2 4

友情链接更多精彩内容