原文地址:https://www.v2ex.com/amp/t/443384

Python 的赋值坑 , a=b=c=1???

今天回答了一个主题, 一不小心进入了一个坑, 耗费了好多时间终于弄懂了
我想要将 a,b,c 变量同时赋值 1, 我使用了
```
In [192]: a = b = c = 1

In [193]: a, b, c
Out[193]: (1, 1, 1)
```
很明显我赋值成功了,a、b、c 都是 1
但是这个下赋值顺序是怎么样的
首先让我们先猜测一下:
第一种方式:a,b,c 同时赋值 1,a=1, b=1, c=1
第二种方式:依次赋值 c=1, b=c, a=b
以上两种显然是很合理的
但是我们要验证一下:
于是我开始说到我遇到的坑(其实这个是在说明 list 的 append 添加方法为什么返回的是 None 出现的)
假如我们创建变量 L 赋值为空, 我们先 L 以切片的形式添加 x 值
```
In [200]: L = []

In [201]: x = 4

In [202]: L[len(L):] = [x]

In [203]: L
Out[203]: [4]
```
我已经添加成功
由于 Python 的引用原理,我们可以多次添加
于是我想多次添加:
```
In [206]: L = []

In [207]: L[len(L):]=L[len(L):] = [x]

In [208]: L
Out[208]: [4, 4]

```
如我所料的一样我成功添加了 2 个 4, 也是说我每次都能获得 4,并向 L 尾部相加, 可以确定是第一种方式, 因为第二种根本只能加进一个 4:
第一种:L[len(L):]= [x], L[len(L):]= [x]
第二种:L[len(L):]= [x],L[len(L):]= L[len(L):]

好下面重点来了,我然后重点来了, 我又写了一个语句
```
In [209]: L = []

In [210]: L = L[len(L):]=L[len(L):] = [x]

In [211]: L
Out[211]: [4, 4, 4, 4]
```
这个不对啊
L 不应该等于[4]或者[4, 4, 4]吗,为什么会预测出两个结果,这个是赋值顺序问题, 正序和逆序
第一种方式的两种顺序:
正序:L = [x], L[len(L):] = [x], L[len(L):] = [x] L=[4,4,4]
逆序:L[len(L):] = [x],L[len(L):] = [x],L=[x] L=[4]

但是为什么会出现[4, 4, 4,4]
唯一的解释便是第三种赋值方式:
L = [x] # L = [4]
L[len(L):]=L # L=[4,4]
L[len(L):]=L # L=[4, 4, 4, 4]
这样我们就完全解释了这种状况
所以针对 a=b=c=1 这种赋值方式,其实是 a=1, b=a, c=a

Python 的赋值坑 , a=b=c=1???的更多相关文章

  1. Python语言防坑小技巧

    Python语言防坑小技巧 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.赋值即定义  1>.运行以下代码会出现报错 #!/usr/bin/env python #_*_ ...

  2. python的赋值

    python的赋值其实就是引用,我们用python的id函数看一下: 然而令人蛋疼的事情发生了, 为什么会给一个新的c赋值1,它与上面的a和b的id一样呢. 原来是python会认为一些小的整形会经常 ...

  3. 如何理解 Python 的赋值逻辑

    摘要: 如果你学过 C 语言,那么当你初见 Python 时可能会觉得 Python 的赋值方式略有诡异:好像差不多,但又好像哪里有点不太对劲. 本文比较并解释了这种赋值逻辑上的差异.回答了为什么需要 ...

  4. Python 直接赋值、浅拷贝和深度拷贝全解析

    直接赋值:其实就是对象的引用(别名,其实就是一个人今天叫张三 明天叫张狗子的意思).这个人比较自由单身狗嘛  可以恋爱可以分手  就是一个小屌丝. 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的 ...

  5. 跳出python的各种坑(1)

    2017-11-1915:38:17 一定要跳出python的各种坑,一开始遇到的好多思维上的认知错误,因为刚开始学习,对python是个什么都不清楚,所以记录一下自己遇到的各种坑.不用担心自己遇到的 ...

  6. python 之 赋值和拷贝(你真的了解吗)

    现象:先上一段代码. >>> import copy >>> a = [1,2,3,4,['a','b']] >>> b = a >> ...

  7. python直接赋值,浅拷贝和深拷贝

    本文参考自<Python 直接赋值.浅拷贝和深度拷贝解析> 定义 直接赋值:就是对象的引用(别名) 浅拷贝(copy):拷贝父对象,不拷贝对象内部的子对象 深拷贝(deepcopy):co ...

  8. python中赋值和浅拷贝与深拷贝

    初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...

  9. Python 直接赋值、浅拷贝和深度拷贝区别

    Python 直接赋值.浅拷贝和深度拷贝区别 转自https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-de ...

随机推荐

  1. 网络操作基础(one)

    P12 一.什么是网络操作系统?网络操作系统具有哪些基本功能? 二.网络操作系统具有哪些特征? 三.常用的网络操作系统有哪些?它们各具有什么特点? 四.在网络操作系统中主要可提供哪些? ———— —— ...

  2. JSP+javaBean:简易投票网页练习

    一.项目目标 session作用域中如果不及时清理一些对象,在一定久的时间或相当数量的请求后,造成session中大量对象堆积,这将严重影响服务器的性能. 在本实例中,通过写一个jsp与javaBea ...

  3. [SQL Server] sysobjects的介紹

    sysobjects表 數據庫中所創建的每個對象(約束.默認值.日誌.規則.存儲過程等)都各以一行資訊呈現於表中. 而臨時對象只有在tempdb內,才在該表中各佔一行. sysobjects 表結構: ...

  4. supervisor支持python虚拟环境venv

    在项目中使用supervisor时,如何在虚拟环境下启动一直存在些小问题. 比如我要写 Cesi程序的监听,我是手动安装的执行之前 要先加载环境source venv/bin/activate 所以写 ...

  5. Mvc Session 设置以后再构造函数中取值时为null问题

    在登录界面写了一个session在 别的页面的构造函数中获取始终未null  后来改成 System.Web.HttpContext.Current.Session["User"] ...

  6. oracle工具sqluldr2和sqlldr的使用

    在 Oracle 数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法:1. 逐条insert -- 只适用少量数据更新 ALTER TABLE order_items DISAB ...

  7. KiCad EDA 原理图库的最佳实践

    KiCad EDA 原理图库的最佳实践 由于有 Alias 别名元件,可以不用一个每一个元件都有一个元件. 对每种元件类型建议一个元件库. 因为 Value 和 元件名是一样的,所以元件名要尽可能的简 ...

  8. 通过Jmeter 代理功能获取postman请求

    对于初学者在Jmeter 配置 请求其实属于比较麻烦的事情,但是如果在Postman配置就容易多了,所以考虑是否可以把postman的配置直接导入Jmeter,避免初学者上手不易的问题,后来考虑使用J ...

  9. vue 中 相同的路由不会跳转,更改路由的办法

    vue 开发的项目,路由跳转的时候,是相同的路由是不会跳转,页面也不会有更新的 有时候 必须要跳转怎么办, 更改一个参数,num,一直在改变.就可以进入了. this.$router.push({ p ...

  10. python基础知识17---装饰器2

    函数式编程复习: def map_test(func,array): array_new=[] for i in array: array_new.append(func(i)) return arr ...