您的位置:首页 > 其它

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

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.")
完。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: