验证“切片是对原来的对象的一个引用”
2016-04-09 18:44
232 查看
在看《Python初学者编程指南》(人民邮电出版社,2014.11)这本书时,发现,可以直接对列表的切片赋值,就能修改列表的值。感觉很奇怪,就写程序验证了一下。
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
theReff = letters # 此时,letters和theReff这两个变量共同引用了同一块内存。
print("letters =>", letters)
mySlice = letters[3:5:1] # 此时,会将letters[3:5:1]的值拷贝一份副本,放到内存中,然后让mySlice引用这块内存。
print("letters[3:5:1] =>", mySlice)
mySlice = ['Z', 'X', 'C', 'V', 'B']
print("after modify mySlice, letters =>", letters)
print("after modify mySlice, theReff =>", theReff)
letters[3:5:1] = ['Z', 'X', 'C', 'V', 'B'] # letters[3:5:1]具有引用的语义,此时修改的是原来的内存。
print("after modify letters[3:5:1], letters =>", letters)
print("after modify letters[3:5:1], theReff =>", theReff)
# 查看letters的各个item的内存地址。请【>>> help(id)】查看详情
print("letters memory address info:")
for idx in range(len(letters)):
print("value=", letters[idx], " idx=", idx, " memory address=", id(letters[idx]), sep="", end="\n")
# 查看letters[3:5:1]的各个item的内存地址
print("letters[3:5:1] memory address info:")
for idx in range(len(letters[3:5:1])):
print("value=", letters[3:5:1][idx], " idx=", idx, " memory address=", id(letters[3:5:1][idx]), sep="")
# 对比内存地址可以看到,letters[3:5:1]确实是引用了letters的内存。
myTuple = ('a', 'b', 'c', 'd', 'e')
if id(myTuple[2]) == id(myTuple[1:4][1]):
print("元组和列表,其切片都有引用的语义。")
else:
print("something is error.")
完。
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
theReff = letters # 此时,letters和theReff这两个变量共同引用了同一块内存。
print("letters =>", letters)
mySlice = letters[3:5:1] # 此时,会将letters[3:5:1]的值拷贝一份副本,放到内存中,然后让mySlice引用这块内存。
print("letters[3:5:1] =>", mySlice)
mySlice = ['Z', 'X', 'C', 'V', 'B']
print("after modify mySlice, letters =>", letters)
print("after modify mySlice, theReff =>", theReff)
letters[3:5:1] = ['Z', 'X', 'C', 'V', 'B'] # letters[3:5:1]具有引用的语义,此时修改的是原来的内存。
print("after modify letters[3:5:1], letters =>", letters)
print("after modify letters[3:5:1], theReff =>", theReff)
# 查看letters的各个item的内存地址。请【>>> help(id)】查看详情
print("letters memory address info:")
for idx in range(len(letters)):
print("value=", letters[idx], " idx=", idx, " memory address=", id(letters[idx]), sep="", end="\n")
# 查看letters[3:5:1]的各个item的内存地址
print("letters[3:5:1] memory address info:")
for idx in range(len(letters[3:5:1])):
print("value=", letters[3:5:1][idx], " idx=", idx, " memory address=", id(letters[3:5:1][idx]), sep="")
# 对比内存地址可以看到,letters[3:5:1]确实是引用了letters的内存。
myTuple = ('a', 'b', 'c', 'd', 'e')
if id(myTuple[2]) == id(myTuple[1:4][1]):
print("元组和列表,其切片都有引用的语义。")
else:
print("something is error.")
完。
相关文章推荐
- js基础1
- SWUST OJ 2304 Lights Out
- dq坐标系
- 问题杂烩(scrollTop/背景透明度动画)
- 《我编程, 我快乐------程序员职业发展之道》 Chad Fowler
- Android中的Service的使用详解
- Item 02:尽量以const,enum,inline 替换 #define
- 关于矩阵最通俗的解释-超级经典zz
- 关于printf()中可变参数的实现的理解
- HTML写的第一个邮箱登陆的界面
- 《Linux操作系统分析》之分析Linux内核如何装载和启动一个可执行程序
- Android 开发 上传用户头像到服务器的数据库再获取显示
- [iOS]File does not exist
- 【勘误清单】《机器学习》 周志华 北京: 清华大学出版社
- Unity3D中使用Leap Motion进行手势控制
- 201509-5 最佳文章
- Android表格自定义控件
- RSA加解密算法java实现(已添加分段加密算法处理)
- Android 编码规范
- Android退出时创建弹窗对话框