Python: names, values, assignment and mutability

推荐先看视频(youtube) Ned Batchelder - Facts and Myths about Python names and values - PyCon 2015

Change variable
# rebinding
x = x + 1
# mutating
nums.append(7)# can also rebind lists:nums = nums + [7]# but you can‘t mutate immutable

make a new list, don‘t change the mutable param

def append_twice(a_list, val):
    a_list.append(val)
    a_list.append(val)

def append_twice_bad(a_list, val):
    """This function is useless"""
    a_list = a_list + [val, val]

def append_twice_good(a_list, val):
    a_list = a_list + [val, val]
    return a_list

shadowcopy and deepcopy

The difference between shallow and deep copying is only relevant for compound objects (objects that contain other objects, like lists or class instances):

A shallow copy constructs a new compound object and then (to the extent possible) inserts references into it to the objects found in the original.
A deep copy constructs a new compound object and then, recursively, inserts copies into it of the objects found in the original.

通过图片了解 compound objects

# objects that contain other objects, like lists or class instances
items = [{‘id‘: 1, ‘name‘: ‘laptop‘, ‘value‘: 1000}, {‘id‘: 2, ‘name‘: ‘chair‘, ‘value‘: 300},]

  

# 但是含有的是 int 这样的就不属于 compound objects  int   疑问:难道不属于 object?

items = [1, 2, 3]

  

看看 shadow copy 与 deepcopy 对 compound object 的不同

from copy import deepcopy, copy

items = [{‘id‘: 1, ‘name‘: ‘laptop‘, ‘value‘: 1000}, {‘id‘: 2, ‘name‘: ‘chair‘, ‘value‘: 300},]
items_deep_copy = deepcopy(items)
items_deep_copy[1][‘id‘] = ‘b‘
items_deep_copy == items

items_copy = copy(items)
items_copy[1][‘id‘] = ‘b‘
items_copy == items

可以看出,deep_copy 是全部重新复制,而 shadow copy 只 deep copy复制了第一层,嵌套的只是复制了引用

疑问:

Python 3.6.0 (default, Dec 24 2016, 08:01:42) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
items = [1, 2, 3, 4, 5, 6]
items_copy = items[:]
items_copy[0] = ‘a‘
items_copy == items
False
# I think this is a shallow copy, and items_copy == items should return True but it‘s False.
# But another example return True
items = [{‘id‘: 1, ‘name‘: ‘laptop‘, ‘value‘: 1000}, {‘id‘: 2, ‘name‘: ‘chair‘, ‘value‘: 300},]
items_copy = items[:]
items_copy[0][‘id‘] = ‘a‘
items_copy == items
True

疑问:Do all mutable objects are composed of immutable objects  

[1, 2, 3] from 1, 2, 3

Like language are composed of words

时间: 2024-10-03 13:45:59

Python: names, values, assignment and mutability的相关文章

python two-dimensional array assignment initialize

#if you want to initialize a 9*9 two-dimensional array [([""]*9) for i in range(9)] #caution: the follow code can't work [[""]*9]*9 shallow copies of list concatenated if you change one row then the prefix row will also be changed

Python数据结构(二)

5.2. The del statement There is a way to remove an item from a list given its index instead of its value: the del statement. This differs from the pop() method which returns a value. The del statement can also be used to remove slices from a list or

Python 点滴 I

[为什么使用Python] 1. 软件质量 2. 开发效率 3. 可移植性 4. 标准库支持 5. 好玩 [Python全景] #模块,语句,表达式,对象) 1. 程序由模块组成 2. 模块包含语句 3. 语句包含表达式 4. 表达式建立并处理对象 [动态类型] Python即是动态类型又是强类型,在C/C++/Java强类型语言中,要先声明,后使用 动态类型:自动跟踪用户定义的类型而不需要预先定义 s=1的话, s*2就等于2 s='hello'的话, s*2就等于'hellohello' [

Python 3 mysql-数据类型

Python 3 mysql 数据类型 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考: http://www.runoob.com/mysql/mysql-data-types.html http://dev.mysql.com/doc/refman/5.7/en/data-type-overview.html 一. 介绍 mysql数据类型概览 1. 数字: 整型:tinyinit int bigint 小数: float :在

Python的平凡之路(2)

一.标准库(sys & os): Python 的标准库(standard library) 是随着 Python 一起安装在你的电脑中的,是 Python 的一部分 (当然也有特殊情况.有些场合会因为系统安全性的要求,不使用全部的标准库,比如说Google App Engine).利用已有的类(class)和函数(function)进行开发,可以省去你从头写所有程序的苦恼. “这些标准库就是盖房子已经烧好的砖,要比你自己去烧砖来得便捷得多 ” ---解释的太到位! sys.path 打印环境变

Python Tutorial 学习(五)--Data Structures

5. Data Structures 这一章来说说Python的数据结构 5.1. More on Lists 之前的文字里面简单的介绍了一些基本的东西,其中就涉及到了list的一点点的使用.当然,它可不仅仅只有那么一点点,这里给出一个更详细一点的说明.来吧骚连,打开你的命令行窗口 >>>help(list) 看看会出来一些什么~~` list.append(x) 向一个序列里面追加元素 x a = [] a.append(x) # 假设x已经定义了 a[len(a):] = [x] l

Python学习 - 编写自己的ORM(2)

上一篇文章简单的实现了ORM(对象关系模型),这一篇文章主要实现简单的MySQL数据库操作. 想要操作数据库,首先要建立一个数据库连接.下面定义一个创建数据库连接的函数,得到一个连接叫做engine. def create_engine(user,password,database,host='127.0.0.1',port=3306,**kw): import mysql.connector global engine if engine is not None: raise DBError(

Python攻关之Django(一)

课程简介: Django流程介绍 Django url Django view Django models Django template Django form Django admin (后台数据库管理工具) 1 Django流程介绍 MTV模式 著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业务对象与数据库的对象(ORM),视图负责与用户的交互(页面),控制器(C)接受用户的输入调用模型和

Python(二)-字符串、列表、字典 、元组、集合

版权声明: 本文作者为-陈鑫 本文的所有内容均来陈鑫总结,未经本人许可,禁止私自转发及使用. QQ: 499741233 E-mail: [email protected] 第1章 字符串处理 1.1 字符串转换 1.1.1 format() 字符串格式化 描    述: 1.花括号声明{}.用于渲染前的参数引用声明,花括号里面可以用数字代表引用参数的序号,或者变量直接引用. 2.从format参数引入的变量名. 3.冒号:为空格填充 4.字符位数声明. 5.千分位的声明. 6.变量类型的声明: