验证“切片是对原来的对象的一个引用”

在看《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.")
完。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值