cs61a lecture13笔记 树的建立 可变性与破坏性

cs61a lecture13笔记

自用 感觉记个笔记会好很多

创建树

两倍数

其实可以简写成一行 tree(label(t)*2,[double© for c in children(t)]))

破坏性操作和非破坏性操作

是否改变原来的结构,第一条是非破坏性,因为他没有改变t

不可变性和可变性

前言:

通过上面介绍可以得出如下两个结论:

1.不管什么类型的参数,在 Python 函数中对参数直接使用“=”符号赋值是没用的,直接使用“=”符号赋值并不能改变参数。
2.如果需要让函数修改某些数据,则可以通过把这些数据包装成列表、字典等可变对象,然后把列表、字典等可变对象作为参数传入函数,在函数中通过列表、字典的方法修改它们,这样才能改变这些数据。

————————————————
 版权声明:这段来自于abyss-phospherus大佬
                        
原文链接:https://blog.youkuaiyun.com/qq_40089648/article/details/98508390

正常常量在函数是无法改变原数值的,但是特殊形式如列表字典元组是可以传递改变的

重回整体

有些数值被创建就是不可变的——元组,字符串,int等等但是也不是完全不可以更改,也可能可以相加(但实际上是创造了一个新的变量,而不是更改),可是列表不一样,他的更改是修改,地址没有变,所以列表是可变的(可以用id验证)

int也是一样的,表面上是修改 其实已经是不一样的东西了

a_tuple = (1, 2)
a_tuple[0] = 3        --error 错误
a_string = "Hi y'all"   
a_string[1] = "I"    -- 错误
a_string += ", how you doing?"  --这是可以的
an_int = 20
an_int += 2       --其实是创建了一个新变量

下面说明一下赋值,赋值其实就是一个更改的过程

>>> a = 3
>>> id(a)
1861194481968
>>> a = 4
>>> id(a)
1861194482000

有些数值是可以改变的 ,例如 列表(list) 和字典(dict)

来看下面一组例子

def do_other_stuff(four):
    four = [2,3,1]	
four = [1, 2, 3, 4]
print(four[0])
do_other_stuff(four)
print(four[0])

输出 : 1
       1

这和我们上面想的不一样 对吧
但是换成下面的就一致了

four = [1, 2, 3, 4]
def do_other_stuff(four):
    four[0]= 3
print(four[0])
do_other_stuff(four)
print(four[0])

输出 1
    3

我觉得,创建的id是不一样的,然后下面的print只能识别全局的变量,新four不是全局的,

但是下面还有一个例子

four = [1, 2, 3, 4]
def do_other_stuff():
    global four
    four = [3,2,1,4]
print(four[0])
do_other_stuff()
print(four[0])

输出 1
    3

真的是很神奇啊 ,这里的four被牢牢绑定了全局的four,amazing

另外,就算是不可变的元组包含了列表,那个列表仍然是可变的

t = (1, [2, 3])
t[1][0] = 99
t[1][1] = "Problems"

>>> t = (1, [2, 3])
>>> t[1][0] = 99
>>> t[1][1] = "Problems"
>>> t
(1, [99, 'Problems'])

除此之外,从抽象来说,树是不可变的(但是打破抽象,实现确实可以变····)

可变树的实现

def tree(label, children=None):
	return [label] + list(children or [])
def label(tree):
	return tree[0]
def children(tree):
	return tree[1:]
def set_label(tree, label):
 	tree[0] = label
def set_children(tree, children):
 	tree[1] = children
    
t = tree(20, [tree(12,
 [tree(9,
 [tree(7), tree(2)]),
 tree(3)]),
 tree(8,
 [tree(4), tree(4)])])
set_label(t, 40)
set_children(t, [tree(24)])

有必要说明啊,这所谓的children =none 其实说的就是 children没有被传递的时候,就是none

List

关于这部分

列表赋值列表,本质上是指向了同一个列表,修改任意一个效果是相同的,另一个也会被影响

列表的复制

listA = [2, 3]
listB = listA
listC = listA[:]
# listC = list(listA) 一个效果
listA[0] = 4
listB[1] = 5

这是创建了一个新的一样的表,与原来的不同

L = [1, 2, 3, 4, 5]
L[2] = 6
L[1:3] = [9, 8]
L[2:4] = [] # Deleting elements
L[1:1] = [2, 3, 4, 5] # Inserting elements
L[len(L):] = [10, 11] # Appending
L = L + [20, 30]
L[0:0] = range(-3, 0) # Prepending

此外 列表也有自己的方法

s = [2, 3]
t = [5, 6]
s.append(4)
s.append(t)
t = 0 # 加入一个元素

s = [2, 3]
t = [5, 6]
s.extend(4)error  # 这句会报错
s.extend(t)
t = 0 # extend 是加入所有元素

s = [2, 3]
t = [5, 6]
t = s.pop() #去除最后一个元素

s = [6, 2, 4, 8, 4]
s.remove(4) #去除第一个与输入相同的元素


t = 0 # 加入一个元素

s = [2, 3]
t = [5, 6]
s.extend(4)error  # 这句会报错
s.extend(t)
t = 0 # extend 是加入所有元素

s = [2, 3]
t = [5, 6]
t = s.pop() #去除最后一个元素

s = [6, 2, 4, 8, 4]
s.remove(4) #去除第一个与输入相同的元素
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值