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) #去除第一个与输入相同的元素