python 赋值
来源:互联网 发布:宁波海关数据 编辑:程序博客网 时间:2024/06/05 16:43
程序员编程语言Python信息技术(IT)
在Python中,令values=[0,1,2];values[1]=values,为何结果是[0,[...],2]?
>>> values = [0, 1, 2]>>> values[1] = values>>> values[0, [...], 2]
我预想应当是
[0, [0, 1, 2], 2]
为何要赋值无限次?
查看全部 2 个回答
142 票,来自 周祥军、侯文辉、郑建波 更多
Python 没有赋值,只有引用。你这样相当于创建了一个引用自身的结构,所以导致了无限循环。为了理解这个问题,有个基本概念需要搞清楚。
Python 没有「变量」,我们平时所说的变量其实只是「标签」。执行
的时候,Python 做的事情是首先创建一个列表对象 [0, 1, 2],然后给它贴上名为 values 的标签。如果随后又执行
的话,Python 做的事情是创建另一个列表对象 [3, 4, 5],然后把刚才那张名为 values 的标签从前面的 [0, 1, 2] 对象上撕下来,重新贴到 [3, 4, 5] 这个对象上。
至始至终,并没有一个叫做 values 的列表对象容器存在,Python 也没有把任何对象的值复制进 values 去。过程如图所示:
执行
的时候,Python 做的事情则是把 values 这个标签所引用的列表对象的第二个元素指向 values 所引用的列表对象本身。执行完毕后,values 标签还是指向原来那个对象,只不过那个对象的结构发生了变化,从之前的列表 [0, 1, 2] 变成了 [0, ?, 2],而这个 ? 则是指向那个对象本身的一个引用。如图所示:
要达到你所需要的效果,即得到 [0, [0, 1, 2], 2] 这个对象,你不能直接将 values[1] 指向 values 引用的对象本身,而是需要吧 [0, 1, 2] 这个对象「复制」一遍,得到一个新对象,再将 values[1] 指向这个复制后的对象。Python 里面复制对象的操作因对象类型而异,复制列表 values 的操作是所以你需要执行
Python 做的事情是,先 dereference 得到 values 所指向的对象 [0, 1, 2],然后执行 [0, 1, 2][:] 复制操作得到一个新的对象,内容也是 [0, 1, 2],然后将 values 所指向的列表对象的第二个元素指向这个复制二来的列表对象,最终 values 指向的对象是 [0, [0, 1, 2], 2]。过程如图所示:
往更深处说,values[:] 复制操作是所谓的「浅复制」(shallow copy),当列表对象有嵌套的时候也会产生出乎意料的错误,比如
问:此时 a 和 b 分别是多少?
正确答案是 a 为 [8, [1, 9], 3],b 为 [0, [1, 9], 3]。发现没?b 的第二个元素也被改变了。想想是为什么?不明白的话看下图
正确的复制嵌套元素的方法是进行「深复制」(deep copy),方法是
Python 没有「变量」,我们平时所说的变量其实只是「标签」。执行
values = [0, 1, 2]
values = [3, 4, 5]
至始至终,并没有一个叫做 values 的列表对象容器存在,Python 也没有把任何对象的值复制进 values 去。过程如图所示:
执行
values[1] = values
要达到你所需要的效果,即得到 [0, [0, 1, 2], 2] 这个对象,你不能直接将 values[1] 指向 values 引用的对象本身,而是需要吧 [0, 1, 2] 这个对象「复制」一遍,得到一个新对象,再将 values[1] 指向这个复制后的对象。Python 里面复制对象的操作因对象类型而异,复制列表 values 的操作是
values[:]
values[1] = values[:]
往更深处说,values[:] 复制操作是所谓的「浅复制」(shallow copy),当列表对象有嵌套的时候也会产生出乎意料的错误,比如
a = [0, [1, 2], 3]b = a[:]a[0] = 8a[1][1] = 9
正确答案是 a 为 [8, [1, 9], 3],b 为 [0, [1, 9], 3]。发现没?b 的第二个元素也被改变了。想想是为什么?不明白的话看下图
正确的复制嵌套元素的方法是进行「深复制」(deep copy),方法是
import copya = [0, [1, 2], 3]b = copy.deepcopy(a)a[0] = 8a[1][1] = 9
- python 赋值
- python赋值
- python 赋值
- python的数字赋值
- python的赋值
- python赋值机制
- Python 变量赋值过程
- python行内赋值
- python 多变量赋值
- Python札记 -- 切片赋值
- python 赋值 类 对象
- python 局部赋值规则
- python 多变量赋值
- PYTHON数据,赋值
- python中的赋值
- python的多重赋值
- python多元赋值
- python---变量赋值
- POJ1564(DFS构造法) Sum It Up
- Codeforces Round #192 (Div. 2)-A. Cakeminator
- 线程池中利用函数指针对任务的动态绑定
- Codeforces Round #192 (Div. 2)-B. Road Construction
- 回滚段测试
- python 赋值
- MapReduce编程基础
- struts1配置动态actionForm
- Search a 2D Matrix
- 无穷数的定义
- mac下matlab编译mex
- 从零开始学C++之模板(四):用模板实现单例模式、模板方式实现动态创建对象
- Hibernate学习笔记(3)——hibernate操作数据库的步骤和核心接口
- android 天气预报 界面